|
|
  |
Resampling 44100 -> 12800, нужна помощь по реализации. |
|
|
|
Dec 18 2012, 17:53
|
Профессионал
    
Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775

|
Цитата(evil_laugh @ Dec 18 2012, 21:36)  В таком случае я просто не могу не задать Вам ужасающий своей тупостью и отдающий крайней степенью дилентантизма вопрос: как считаете такой фильтр Вы, что у Вас получается 150 коэффициентов? Фильтр, который стоит между интерполятором и дециматором при однокаскадном дробном ресамплинге, должен работать на частоте дискретизации, которая получается после интерполяции. В моём случае она равна 44100*128 = 5.625 МГц. Если рассчитать на эту частоту ФНЧ с требуемыми параметрами - получится больше 7 тысяч коэффициентов. Что я делаю не так?  ну потому как порядок фильтра и будет определяться отношением частот 44100/12800, т.е. оверсемплингом + подбираем нужное окно. А Вы пытаетесь сначала провести целочисленную интерполяцию в 128 раз. конечно при таком оверсемплинге и к-ту подавления -60 дБ у Вас получится нереальный порядок фильтра. АЧХ смотрел на "глаз", поэтому могут быть небольшие отклонения в количестве коэффициентов. Цитата(Самурай @ Dec 18 2012, 21:41)  Соврал немного про каскады 4/7 и 4/3, фильтры там нужны все-таки побольше  Если снова чего не напутал, то получается так: 44100*(4/3) = 58800 - фильтр 12 порядка (подавление 80дБ), 58800*(4/7) = 33600 - фильтр 33 порядка (подавление 80дБ), 33600*(4/7) = 19200 - фильтр 54 порядка (подавление 80дБ) И последний каскад с основной фильтрацией (про который уже говорилось): 19200*(2/3) = 12800 - фильтр 155 порядка. я на это как раз и обратил внимание, но проверять не хочется
|
|
|
|
|
Dec 19 2012, 18:30
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 4-10-11
Пользователь №: 67 546

|
Цитата(alex_os @ Dec 19 2012, 08:28)  А если так попробовать: 1. Делаем ФHЧ тактовой 44100 с подавлением -60 дБ на 6.2 кГц 2. Полиноминальный интерполятор 3го порядка, или вообще линейный.
Порядок ФНЧ у меня получается что-то около 350. Можно его реализовать в частотной области на основе FFT512, либо способом частотной маски. Вот тут не совсем понял... Вы предлагаете сперва ограничить по частоте исходный сигнал, а потом куда-то его интерполировать?.. Тем временем я спешу доложить о результатах моих сегодняшних изысканий. Цитата(des00 @ Dec 18 2012, 19:43)  судя по всему в вас оверсамплинг в 44,1/6 = 7,35 раза. Берем кубический фарроу, делаем ресамплинг 44100 -> 38400 (тут только надо посмотреть, куда избыточный шум завернется) ну и затем классический дециматор на 3. Матлаб рисует фильтр 155 порядка (затухание на 6400 60дб, в полосе 6000 неравномерность 3дБ), что для децимирующего фильтра не так уж и много. Сделал я Фарроу. Кубический. Симметричный. Децимирует с 44100 до 38400. Тестировал так: генерировал испытательный синус 0 dBFS с ЛЧМ модуляцией (от 0 до 20 кГц в течение 100 секунд) и прогонял через наскоро набросанную на Си программку. Результат печален. На частотах до 2-3 кГц всё неплохо, гармоники в сигнал не лезут. С повышением частоты начинаются весёлости. Какие - красочно иллюстрирует рисунок ниже. На входе синус 6 кГц, Fд = 44100. На выходе - вот что.  Хорошо видно, что из-за полиномиальной интерполяции в сигнал лезут ложные гармоники просто из-за ошибки интерполяции. Сгенерировал в маткаде идеальный дискретный синус и нашёл разность полученного мной сигнала и идеального. Полная шкала от -32768 до +32767.  Сдаётся мне, что либо этот метод не слишком хорошо применим, либо я что-то делаю не так... Программу проверял, кажется, Фарроу пашет правильно.
Сообщение отредактировал evil_laugh - Dec 19 2012, 18:33
|
|
|
|
|
Dec 20 2012, 04:35
|
Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 12-05-06
Пользователь №: 17 030

|
Цитата(evil_laugh @ Dec 19 2012, 21:30)  Вот тут не совсем понял... Вы предлагаете сперва ограничить по частоте исходный сигнал, а потом куда-то его интерполировать?.. Понижать частоту дискретизации до требуемой. Тем же фарроу или линейным интерполятором. Суть в том, что нужно сначала отфильтровать сигнал до требуемых 6.2 кГц а потом переходить на другую частоту дискретизации. В противном случае все что выше 6.2 кГц неизвестно куда завернется. upd: По моим оценкам полинома 3го порядка должно хватить чтобы уйти с 44100 на 12800. Код Fs = 44100; K =17 % коэф. передискритезации вверх не важно какой h0 = ones(1,K); h1 = conv(h0, h0); % интерполяция полиномом 1го порядка h1 = h1/sum(h1); h2 = conv(h1, h1); h2 = h2/sum(h2); % интерполяция полиномом 3го порядка hfir = firpm(380, [0,6000/(Fs/2), 6200/(Fs/2),1], [1,1,0, 0], [0.01,1]); figure(1); freqz(h2,1); F = [1:Fs/2]; H = freqz(hfir, 1, F, Fs); figure(1); plot(F, 20*log10(abs(H)));
htmp = zeros(1, length(hfir)*K); htmp(1:K:end) = hfir;
hall = conv(htmp, h2);
figure(2); freqz(hall,1);
Эскизы прикрепленных изображений
--------------------
ну не художники мы...
|
|
|
|
|
Dec 20 2012, 06:25
|
Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 12-05-06
Пользователь №: 17 030

|
Цитата(des00 @ Dec 20 2012, 09:00)  сделал модель в симулинке с интерполятором 4 го порядка, не очень получается, особенно выше 3КГц. На выходном синусе паразитная АМ, возникающая из-за переменной фазы при децимации с 51200/38400 на 12800. Что-то мне подсказывает что на полиномиальных интерполяторах лучше не сделать, ну разве что интерполировать сначала раз в 16, а потом опускаться. Что-то не так. Берем синус 3 кГц Fs = 44100 и интерполятором 4го порядка напрямую опускаем на Fs=12800. Должно идеально получаться...
--------------------
ну не художники мы...
|
|
|
|
|
Dec 20 2012, 07:41
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата alex_os: По моим оценкам полинома 3го порядка должно хватить чтобы уйти с 44100 на 12800. Для 3-степени погрешность интерполяции синуса единичной амплитуды: err<= 3/8*(pi*f0/fd)^4 fd=44100 для f0=3000 err<= 7.822785453414741e-004 для f0=4000 err<=0.002472386513672 для f0=6000 err<= 0.012516456725464 Топикстартеру это не понравится. Если выполнить хотя бы 2-х кратный оверсамплинг 44100 -> 88200 для f0=3000 err<= 4.889240908384213e-005 для f0=4000 err<=1.545241571044886e-004 для f0=6000 err<= 7.822785453414741e-004 Это уже топикстартера должно устроить. Порядок фильтра-интерполятора ~700.
|
|
|
|
|
Dec 20 2012, 09:32
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 4-10-11
Пользователь №: 67 546

|
Большое всем спасибо за грамотные и содержательные ответы. Картина значительно прояснилась. Попробую повысить частоту дискретизации и потом использовать Лагранжа. Надо учиться пользоваться Матлабом, а то симуляция различных вариантов много времени занимает
|
|
|
|
|
Dec 20 2012, 16:16
|
Профессионал
    
Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775

|
Цитата(evil_laugh @ Dec 19 2012, 21:30)  Сделал я Фарроу. Кубический. Симметричный. Децимирует с 44100 до 38400. Тестировал так: генерировал испытательный синус 0 dBFS с ЛЧМ модуляцией (от 0 до 20 кГц в течение 100 секунд) и прогонял через наскоро набросанную на Си программку. Результат печален. На частотах до 2-3 кГц всё неплохо, гармоники в сигнал не лезут. С повышением частоты начинаются весёлости. Какие - красочно иллюстрирует рисунок ниже. На входе синус 6 кГц, Fд = 44100. На выходе - вот что. Накидал и я свой интерполятор по алгоритму, который предлагал выше. Децимирует с 44100 до 12800. Тестируемый сигнал - бигармонический сигнал с частотами 3500 и 14000 Гц. Вот что получилось: до
после
вроде как требования выполняются
|
|
|
|
|
Dec 20 2012, 17:12
|
Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 12-05-06
Пользователь №: 17 030

|
Цитата(thermit @ Dec 20 2012, 10:41)  Для 3-степени погрешность интерполяции синуса единичной амплитуды:
err<= 3/8*(pi*f0/fd)^4 ... Похоже на то. Я сжульничал и вместо лагранжа 3ей степени вставил нечто другое. Правильные рога для Лагранжа 1, 3, 5 порядков такие (см. в самом низу). Выходит что нужен Лагранж 5 степени чтобы с 44100 перейти на 12800 при <-60 дБ наложений. Код Fs = 44100; K =11 % коэф. передискритезации вверх не важно какой
hfir = firpm(380, [0,6000/(Fs/2), 6200/(Fs/2),1], [1,1,0, 0], [0.01,1]); F = [1:Fs/2]; H = freqz(hfir, 1, F, Fs); figure(1); plot(F, 20*log10(abs(H)));
for p=1:2:5 h = intfilt(K,p,'Lagrange'); h = h/sum(h); htmp = zeros(1, length(hfir)*K); htmp(1:K:end) = hfir;
hall = conv(htmp, h);
figure(2); hold on; freqz(hall,1); end Цитата(Serg76 @ Dec 20 2012, 19:16)  Накидал и я свой интерполятор по алгоритму, который предлагал выше. Децимирует с 44100 до 12800. Тестируемый сигнал - бигармонический сигнал с частотами 3500 и 14000 Гц. Вот что получилось: Частоты неинтересные у Вас  . Интересно что получится если подать два синуса 6 кГц и 6.2 кГц...
Эскизы прикрепленных изображений
--------------------
ну не художники мы...
|
|
|
|
|
Dec 20 2012, 18:54
|
Профессионал
    
Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775

|
Цитата(evil_laugh @ Dec 20 2012, 22:35)  Serg76, похоже, Вы познали Дао. У меня только один вопрос: КАК?  Можно, пожалуйста, подробнее про алгоритм?  да как и описывал выше на основе полифазника, здесь ничего сверхестественного, правильно подберите нужное окно. я взял распространенное Наттала, правда пришлось все-таки увеличить порядок фильтра до 300, вроде как в -70 дБ влезли (пардон, -60 дБ)  А вообще, -60 дБ - это еще по-Божески, где-то попадалось на просторах Инета ресамплер как раз звукового диапазона с подавлением чуть ли не -120 дБ.
Сообщение отредактировал Serg76 - Dec 20 2012, 19:02
|
|
|
|
|
Dec 20 2012, 19:03
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 4-10-11
Пользователь №: 67 546

|
Цитата(Serg76 @ Dec 20 2012, 21:54)  да как и описывал выше на основе полифазника, здесь ничего сверхестественного, правильно подберите нужное окно. я взял распространенное Наттала, правда пришлось все-таки увеличить порядок фильтра до 300, вроде как в -70 дБ влезли (пардон, -60 дБ)  То есть Вы делаете простую однокаскадную передискретизацию, но с таким вот хитрым фильтром? А на какую частоту дискретизации фильтр считался? Я так понимаю, Вы не делали "честное" повышение частоты дискретизации до 44100*128, а сделали как-то по-другому? А как?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|