На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> pcm audio resampling , Быстое преобразование частоты дискретизации
    Всем привет.
    Собственно сабж.
    Нужен алгоритм изменеия частоты дискретизации звукового сигнала.
    В данном случае вычислительные затраты важнее чем качество, но в разумных приделах :)
    А лучше золотую середину.
    Я придумал только дубовый метод - повторять семпл энное количество раз.
    Но из-за этого возникает некий свист - шум высокочастотный.
    Короче надо что-нибудь поинтеллектуальней. А идей у меня больше нет.
    Буду рад любой помощи, где хоть почитать можно (желательно на русском).
      Не ну просто всавлять одно и тоже это извращение(попробуй заполни буфер вывода весь одним значением, сначала перескок, а затем?), лучше уж вычислять хотя бы среднее значение между ближайшими значениями, и так постепенно сводить разрыв между ними на нет, но это фигня тоже. Лучше строить локальный сплайн, чуть более тормознее, но не намного практически не ощутимо на 11025->44100 на 0,5с, на exponenta.ru кажется описано как строить.
        Цитата Necros @
        Не ну просто всавлять одно и тоже это извращение(попробуй заполни буфер вывода весь одним значением, сначала перескок, а затем?), лучше уж вычислять хотя бы среднее значение между ближайшими значениями, и так постепенно сводить разрыв между ними на нет, но это фигня тоже. Лучше строить локальный сплайн, чуть более тормознее, но не намного практически не ощутимо на 11025->44100 на 0,5с, на exponenta.ru кажется описано как строить.

        Сплайн, конечно звучит красиво но геморно, однако, это ИМХО.

        Если важна скорость, а на остальное наплевать по большому счету, то просто проидись интерполяцией (формула Лагранджа, Ньютона, что больше нравиться). Порядок сильно большой не надо, не больше 10. Это тот же сплайн, но вид сбоку, оно же фильтрация (все зависит от того, как на данное смотреть). Формулы писать проще. Да и порядок подобрать проще. Сначала линейную, потом квадратичную и т.д. - формулы тривиальны, в любом учебнике по численным методам и справочниках есть.
        По большому счету разницы между сплайном и интерполяцией нет. А в задаче передискретизации применение именно сплайна сильно спорно.

        Если говорить более серьезно, то передискретизация не сильно тривиальная задача, как впрочем и все что связано с обработкой сигналов. Для более серьезнеого решения, поиши по слову resampling, видел достаточно много инфы и серьезной на эту тему в инете.
        Но вполне вероятно, что дубового решения с интерполяцией вполне хватит.
        Потому как для остального нужно рассматривать серьезно критерия качества в конкретной задаче и отсюда плясать.
        Сообщение отредактировано: Vzhyk -
          Спасибо всем откликнувшимся :)
          Цитата Necros @
          Не ну просто всавлять одно и тоже это извращение(попробуй заполни буфер вывода весь одним значением, сначала перескок, а затем?), лучше уж вычислять хотя бы среднее значение между ближайшими значениями, и так постепенно сводить разрыв между ними на нет, но это фигня тоже.

          Ну до этого я додумался сам - качество такое-же как и при простом повторении сэмплов.
          Короче такой метод не подходит.
          Насчёт интерполяции и формул Лагранджа и Ньютона сейчас буду смотреть.
          Ещё раз спасибо.
          В общем я тут посмотрел...
          Может я чего не понимаю, но. Допустим я по формуле Лагранжа вычисляю промежуточные значения.
          Но как определить сколько их должно быть?
          Понятно, что при ресемплинге 24kHz->48kHz будет по одному значению, а как быть если коэффициент выходит дробный?
          Сообщение отредактировано: cppasm -
            Цитата cppasm @
            Может я чего не понимаю, но. Допустим я по формуле Лагранжа вычисляю промежуточные значения.
            Но как определить сколько их должно быть?
            Понятно, что при ресемплинге 24kHz->48kHz будет по одному значению, а как быть если коэффициент выходит дробный?

            Ну представь частота 24000 Гц. Значит шаг по времени у тебя 1/24000 секунды. У тебя есть значения функции в этих точках.
            Меняешь частоту дискретизации, соответственно у тебе меняется шаг. И тебе нужно вычислить приближенное значение функции в этих точках.
            Думаю, в такой постановке задача понятнее.

            В общем случае ты имеешь табличное представление некоей функции и тебе нужно приближенно вычислить значения этой функции не в узлах сетки. Причем сетка равномерная.
            Формулы Ньютона или Лагранджа здесь выписывать не буду.

            Р.S. Вот если полученный результат не удовлетворит, тогда придется уже серьезно заняться передискретизацией с учетом минимальных искажения спектра.
            Более правильно, делать передискретизацию на наименьшее общее кратное двух твоих частот (для 24 и 48, это 48), затем фильтровать низкочастотным фильтром по частоте Найквиста или ниже и делать прореживание.
              Спасибо, я уже разобрался.
              Сделал кубическую интерполяцию по формуле Ньютона с разделёнными разностями.
              Вроди нормально получилось :)
              Цитата Vzhyk @
              Более правильно, делать передискретизацию на наименьшее общее кратное двух твоих частот (для 24 и 48, это 48), затем фильтровать низкочастотным фильтром по частоте Найквиста или ниже и делать прореживание.

              А можно по-подробнее про фильтрацию...
              Это делать разложение на гармоники надо и потом отсеивать определённые из них или есть способ по-проще?
              В смысле я понимаю как это сделать при помощи разложения в ряд Фурье, но хочется чего-нибудь по-проще.
                Цитата cppasm @
                Спасибо, я уже разобрался.
                Сделал кубическую интерполяцию по формуле Ньютона с разделёнными разностями.
                Вроди нормально получилось :)

                Возможно этого вполне и достаточно для данной задачи.
                Цитата Vzhyk @
                Более правильно, делать передискретизацию на наименьшее общее кратное двух твоих частот (для 24 и 48, это 48), затем фильтровать низкочастотным фильтром по частоте Найквиста или ниже и делать прореживание.

                А можно по-подробнее про фильтрацию...
                Цитата

                Это делать разложение на гармоники надо и потом отсеивать определённые из них или есть способ по-проще?
                В смысле я понимаю как это сделать при помощи разложения в ряд Фурье, но хочется чего-нибудь по-проще.

                Нет не надо, можно и так идти, но выглядит слишком сложно.
                Основное требование есть, если делать прореживание сигнала, это чтобы в прореживаемом сигнале не было частот выше полосы, равной половине от от нужной тебе частоты дискретизации. Соответственно тебе просто нужно построить нужный фильтр и воспользоваться им, а потом взять отсчеты по нужному шагу.
                Вот в этой части тебе и придется почитать учебники по фильтрации сигналов и построению фильтров. Потому как далее удаленно я уже не советчик, допустимые искажения спектра при передискретизации и т.д., это все нужно считать и смотреть. Тем не менее именно данной задачей мне не приходилось заниматься, т.е. я рассказал только практическую, частично, часть, поэтому далее по этому пути двигайся сам, если такая потребность действительно есть в данной задаче.
                Мне эта задача не интересна и не нужна сейчас, так что, чем мог, тем помог.
                Учебники - dsp-book.narod.ru
                Кстати, по слову resamling google выдает очень приличную ссылку (одна из кучи).

                Все что я писал более практическая часть, чем теоретическая, так что если где возникают неточности относительно теории....

                P.S. Кстати эта тема больше в программирование звука, чем алгоритмы.
                  Ok. Спасибо за помощ.
                    Это мое... Вроде как запатентованное, и придуманное 10 лет назад. Как работает, в общем-то скрывать уже нечего, при интересе расскажу Прикреплённый файлПрикреплённый файлResampler.zip (4,72 Кбайт, скачиваний: 597) [attach=#1][/attach]
                      Цитата AlexeyG @
                      Как работает, в общем-то скрывать уже нечего, при интересе расскажу

                      "Попросите меня, ну пожалуйста, ну что вам, жалко, что ли?"... детский сад. Хочешь - рассказывай, не хочешь - не рассказывай.

                      Цитата AlexeyG @
                      Вроде как запатентованное

                      Выходные данные патента (а если есть - то ещё и соответствующие ссылки) в студию.
                        Блин... Увидел в Алгоритмах интересную тему, навострил лыжи отвечать, раскатал губу на интересную дискуссию - а теме больше 16 лет.
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0476 ]   [ 17 queries used ]   [ Generated: 26.04.24, 11:15 GMT ]