|
Передискретизация звука методом интерполяции, подскажите качественный алгоритм |
|
|
|
Nov 17 2011, 11:35
|
Группа: Участник
Сообщений: 14
Регистрация: 17-11-11
Пользователь №: 68 362

|
Стоит казалось бы банальная задача: Сигнал с опорной частотой 44.1 кГц преобразовать в сигнал с частотой 48 кГц. Алгоритмы с FFT по некоторым причинам не подходят, поэтому было решено использовать интерполяцию. Но коэффициент 1.088 и звуки вплоть до всеми любимых 20 кГц пока что ставят нас в тупик. Алгоритмы Lanczos, B-Spline, Mittchel, Sinc результат дают, но где-то гармоники зашкаливают, где-то частоты урезаются. В первую очередь интересуют минимальные гармонические искажения, задача вторая по степени важности - минимальный срез АЧХ. Может быть есть более подходящие для обработки звука алгоритмы? Подскажите, пожалуйста!
|
|
|
|
|
 |
Ответов
(30 - 44)
|
Nov 18 2011, 10:26
|
Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 31-03-05
Из: Зеленоград
Пользователь №: 3 839

|
линейность ФЧХ принципиальна ? Цитата(soolo @ Nov 18 2011, 12:48)  Честно говоря, не понимаю смысла выкладывать тестовый файл. Ведь реально интерполятор будет работать с обычными звуковыми файлами (а там спектр сигнала вплоть до 20Гц-20кГц). Но файлом поделюсь. http://dl.dropbox.com/u/23094927/Test%20si...2016-bit%29.wavпри таком сигнале либо БИХ, либо полифазник из двух параллельных КИХ-ФНЧ в несколько сотен отсчетов больше никак не достичь хорошей расфильтровки вблизи частоты Найквиста, если не хотите FFT
|
|
|
|
|
Nov 18 2011, 12:14
|
Группа: Участник
Сообщений: 14
Регистрация: 17-11-11
Пользователь №: 68 362

|
Ну вот и свершилось! Lanczos и степень полинома 7 дали идеальный по параметрам результат. Единственное, на слух всё-таки есть неточности в преобразовании высоких частот
Всем большое спасибо за ответы и советы. Узнал из этой темы пару фишек на будущее = )
|
|
|
|
|
Nov 18 2011, 12:25
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата soolo: Lanczos и степень полинома 7 дали идеальный по параметрам результат. Есть подозрение, что оптимальный чебышевский фильтр вместо ланцоша даст еще более идеальный результат.
|
|
|
|
|
Nov 18 2011, 18:15
|
Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 12-05-06
Пользователь №: 17 030

|
Цитата(Самурай @ Nov 17 2011, 21:45)  Я не совсем понимаю, а что мешает Вам реализовать честный интерполятор в 48/44.1 = 160/147 раз? Честно повышаете частоту дискретизации в 160 раз, честно фильтруете наложения (тем самым полифазным фильтром, про который тут дискуссия возникла), потом честно оставляете только каждый 147-ой отсчет, остальное честно выкидываете нафиг  . Тем более что Вы сами говорили, что особых ограничений на ресурсы у Вас нет. Да и какие нафиг нужны ресурсы, когда все частоты "детские"??? Для справки, 160 = 2*2*2*2*2*5, т.е. частоту можно повышать постепенно, после каждого шага фильтруете наложения, первый фильтр навскидку 100...140-ого порядка (для подавления наложений в 100...120дБ), второй фильтр примерно 15-ый порядок, остальные фильтры на уровне нуля. Реализация фильтра 100-ого порядка на частоте 44кГц (та самая полифазность) требует 5-10MIPS, о чем тут вообще говорить? Зачем постепенно повышать частоту дискретизации??. Если оптимизировать эту структуру и на нули не умножать и считать только те выходные отсчеты, которые нужны, то получится FIR в который данные заливаются с частотой 48 кГц а выходные данные считаются с частотой 44кГц. А коэффициенты фильтра каждый раз берутся из здоровенной таблицы. А длина фильтра вряд ли будет больше 20  .
--------------------
ну не художники мы...
|
|
|
|
|
Nov 18 2011, 20:02
|
Группа: Участник
Сообщений: 14
Регистрация: 17-11-11
Пользователь №: 68 362

|
Цитата(Fast @ Nov 18 2011, 20:37)  да как-то не верю, что все хорошо и звона нет soolo, не хочу показаться назойливым, а можно теперь файл после Ланцоша 48к прикрепить ? в последний разок Остался на работе. В понедельник обязательно поделюсь
|
|
|
|
|
Nov 21 2011, 06:26
|
Группа: Участник
Сообщений: 14
Регистрация: 17-11-11
Пользователь №: 68 362

|
Цитата(soolo @ Nov 18 2011, 23:02)  Остался на работе. В понедельник обязательно поделюсь Как и обещал http://dl.dropbox.com/u/23094927/L7_44_48.wav
Сообщение отредактировал soolo - Nov 21 2011, 07:18
|
|
|
|
|
Nov 21 2011, 07:08
|
Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 31-03-05
Из: Зеленоград
Пользователь №: 3 839

|
Цитата(soolo @ Nov 21 2011, 10:26)  после Ланзоша уровень уменьшился на 3dB а теперь посмотрите спектрограмму и мгновенный фурье-спектр в р-не 1млн отсчета (редактор CoolEdit 2.0) скрины bmp http://depositfiles.com/files/gkpvj1ujiфайл 44100.bmp - исходный файл 48000ce.bmp - resampling с помощью CoolEdit файл 48000lanczos.bmp - ваш Ланцош, с усилением в 3дБ p.s. т.е. если непонятно, то скажу вкратце - качество ужасно (особенно это заметно в области линейной прозвонки р-н 870тыс. отсчета, см. выше 20кГц)
|
|
|
|
|
Nov 21 2011, 07:35
|
Группа: Участник
Сообщений: 14
Регистрация: 17-11-11
Пользователь №: 68 362

|
Это не Ланцош понизил уровень, это я не мог записывать сигнал с той же амплитудой - так уж получилось =) Результат не так и ужасен, особенно если учесть результаты других алгоритмов. Шумы на уровне -85 дБ нас устраивают Зато алгоритм на 100% гибкий и позволяет преобразовывать в любую частоту без увеличения вычислительной нагрузки. (Мы ушли от алгоритма "сначала увеличиваем частоту, затем уменьшаем" идёт только прямое преобразование.) Вот результаты тестов
Неравномерность АЧХ (в диапазоне 40 Гц - 15 кГц), дБ +0.02, -0.04 Отлично Уровень шума, дБ (А) -95.2 Отлично Динамические диапазон, дБ (А) 94.4 Очень хорошо Гармонические искажения, % 0.061 Средне Гармонические искажения + шум, дБ(A) -60.6 Плохо Интермодуляционные искажения + шум, % 0.033 Хорошо Взаимопроникновение каналов, дБ -97.9 Отлично Интермодуляции на 10 кГц, % 0.048 Хорошо Общая оценка Очень хорошо
Боюсь что следующая ступенька качества возможна только с помощью Фурье
Сообщение отредактировал soolo - Nov 21 2011, 07:41
|
|
|
|
|
Nov 21 2011, 08:10
|
Группа: Участник
Сообщений: 14
Регистрация: 17-11-11
Пользователь №: 68 362

|
Цитата(Fast @ Nov 21 2011, 10:50)  попробуйте протестировать не в среднем по больнице, а на интервале 836-994тыс. отсчеты хотя если устраивает - вопросов нет На те отсчёты фильтра вообще нужно кинуть =) Такого сигнала в принципе не было, это паразиты Я же не говорю, что всё супер, я говорю, что в принципе неплохо, особенно учитывая все ограничения, которые стояли перед нами.
|
|
|
|
|
Nov 21 2011, 08:10
|
Местный
  
Группа: Свой
Сообщений: 216
Регистрация: 31-03-05
Из: Зеленоград
Пользователь №: 3 839

|
для интереса, т.е. чистоты эксперимента, попробуйте вот этот ФНЧ для 2x up-samp перед Lanczos в нем 256 отводов, обе части симметричны, потребуется 128 умножений Код const int BL = 256; const int16_T B[256] = { 11, 22, 9, -18, -15, 14, 19, -12, -22, 9, 25, -7, -27, 5, 29, -4, -31, 2, 33, 0, -35, -1, 37, 3, -40, -5, 42, 6, -44, -8, 47, 10, -49, -12, 52, 14, -54, -16, 57, 18, -60, -20, 63, 22, -66, -25, 69, 27, -72, -30, 76, 33, -80, -36, 83, 39, -87, -43, 91, 46, -96, -50, 100, 54, -105, -58, 110, 63, -115, -67, 121, 73, -126, -78, 133, 84, -139, -90, 146, 97, -154, -104, 162, 112, -171, -121, 180, 130, -191, -141, 202, 152, -214, -165, 228, 179, -243, -195, 261, 213, -280, -233, 302, 257, -328, -285, 359, 318, -395, -358, 440, 407, -496, -470, 567, 553, -664, -666, 800, 833, -1008, -1101, 1367, 1606, -2135, -2919, 4946, 14721, 14721, 4946, -2919, -2135, 1606, 1367, -1101, -1008, 833, 800, -666, -664, 553, 567, -470, -496, 407, 440, -358, -395, 318, 359, -285, -328, 257, 302, -233, -280, 213, 261, -195, -243, 179, 228, -165, -214, 152, 202, -141, -191, 130, 180, -121, -171, 112, 162, -104, -154, 97, 146, -90, -139, 84, 133, -78, -126, 73, 121, -67, -115, 63, 110, -58, -105, 54, 100, -50, -96, 46, 91, -43, -87, 39, 83, -36, -80, 33, 76, -30, -72, 27, 69, -25, -66, 22, 63, -20, -60, 18, 57, -16, -54, 14, 52, -12, -49, 10, 47, -8, -44, 6, 42, -5, -40, 3, 37, -1, -35, 0, 33, 2, -31, -4, 29, 5, -27, -7, 25, 9, -22, -12, 19, 14, -15, -18, 9, 22, 11 }; \ и глянем разницу в картинках
|
|
|
|
|
Nov 21 2011, 08:17
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата soolo: Зато алгоритм на 100% гибкий и позволяет преобразовывать в любую частоту без увеличения вычислительной нагрузки. Мы ушли от алгоритма "сначала увеличиваем частоту, затем уменьшаем" идёт только прямое преобразование. Цитата Боюсь что следующая ступенька качества возможна только с помощью Фурье Да уш... ©
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|