реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Resampling 44100 -> 12800, нужна помощь по реализации.
Serg76
сообщение Dec 18 2012, 17:53
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775



Цитата(evil_laugh @ Dec 18 2012, 21:36) *
В таком случае я просто не могу не задать Вам ужасающий своей тупостью и отдающий крайней степенью дилентантизма вопрос: как считаете такой фильтр Вы, что у Вас получается 150 коэффициентов? sm.gif

Фильтр, который стоит между интерполятором и дециматором при однокаскадном дробном ресамплинге, должен работать на частоте дискретизации, которая получается после интерполяции. В моём случае она равна 44100*128 = 5.625 МГц. Если рассчитать на эту частоту ФНЧ с требуемыми параметрами - получится больше 7 тысяч коэффициентов. Что я делаю не так? sad.gif

ну потому как порядок фильтра и будет определяться отношением частот 44100/12800, т.е. оверсемплингом + подбираем нужное окно. А Вы пытаетесь сначала провести целочисленную интерполяцию в 128 раз. конечно при таком оверсемплинге и к-ту подавления -60 дБ у Вас получится нереальный порядок фильтра. АЧХ смотрел на "глаз", поэтому могут быть небольшие отклонения в количестве коэффициентов.

Цитата(Самурай @ Dec 18 2012, 21:41) *
Соврал немного про каскады 4/7 и 4/3, фильтры там нужны все-таки побольшеsm.gif
Если снова чего не напутал, то получается так:

44100*(4/3) = 58800 - фильтр 12 порядка (подавление 80дБ),
58800*(4/7) = 33600 - фильтр 33 порядка (подавление 80дБ),
33600*(4/7) = 19200 - фильтр 54 порядка (подавление 80дБ)

И последний каскад с основной фильтрацией (про который уже говорилось):
19200*(2/3) = 12800 - фильтр 155 порядка.

я на это как раз и обратил внимание, но проверять не хочется sm.gif
Go to the top of the page
 
+Quote Post
alex_os
сообщение Dec 19 2012, 05:28
Сообщение #17


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 12-05-06
Пользователь №: 17 030



А если так попробовать:
1. Делаем ФHЧ тактовой 44100 с подавлением -60 дБ на 6.2 кГц
2. Полиноминальный интерполятор 3го порядка, или вообще линейный.

Порядок ФНЧ у меня получается что-то около 350. Можно его реализовать в частотной области на основе FFT512,
либо способом частотной маски.


--------------------
ну не художники мы...
Go to the top of the page
 
+Quote Post
evil_laugh
сообщение Dec 19 2012, 18:30
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
thermit
сообщение Dec 19 2012, 20:51
Сообщение #19


Знающий
****

Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730



Результат соответствует действительности.

точность лагранжа повышается повышением частоты дискретизации.
например:

44100->132300 фнч с заданной х-кой (~1300x16 коэффициентов + ~400x16 память фильтра) -> 12800 при помощи лагранжа.
Если 1-го порядка (линейная интерполяция) подавление > =60дб ~10-11 mips.

Можно порядок немного уменьшить, но за счет применения интерполяции более высоких порядков.

Сообщение отредактировал thermit - Dec 19 2012, 20:53
Go to the top of the page
 
+Quote Post
alex_os
сообщение Dec 20 2012, 04:35
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 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);

Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
ну не художники мы...
Go to the top of the page
 
+Quote Post
des00
сообщение Dec 20 2012, 06:00
Сообщение #21


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(thermit @ Dec 19 2012, 15:51) *
Можно порядок немного уменьшить, но за счет применения интерполяции более высоких порядков.

сделал модель в симулинке с интерполятором 4 го порядка, не очень получается, особенно выше 3КГц. На выходном синусе паразитная АМ, возникающая из-за переменной фазы при децимации с 51200/38400 на 12800. Что-то мне подсказывает что на полиномиальных интерполяторах лучше не сделать, ну разве что интерполировать сначала раз в 16, а потом опускаться.


--------------------
Go to the top of the page
 
+Quote Post
alex_os
сообщение Dec 20 2012, 06:25
Сообщение #22


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 12-05-06
Пользователь №: 17 030



Цитата(des00 @ Dec 20 2012, 09:00) *
сделал модель в симулинке с интерполятором 4 го порядка, не очень получается, особенно выше 3КГц. На выходном синусе паразитная АМ, возникающая из-за переменной фазы при децимации с 51200/38400 на 12800. Что-то мне подсказывает что на полиномиальных интерполяторах лучше не сделать, ну разве что интерполировать сначала раз в 16, а потом опускаться.

Что-то не так. Берем синус 3 кГц Fs = 44100 и интерполятором 4го порядка напрямую опускаем на Fs=12800.
Должно идеально получаться...


--------------------
ну не художники мы...
Go to the top of the page
 
+Quote Post
thermit
сообщение Dec 20 2012, 07:41
Сообщение #23


Знающий
****

Группа: Участник
Сообщений: 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.

Go to the top of the page
 
+Quote Post
evil_laugh
сообщение Dec 20 2012, 09:32
Сообщение #24


Участник
*

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



Большое всем спасибо за грамотные и содержательные ответы. Картина значительно прояснилась. Попробую повысить частоту дискретизации и потом использовать Лагранжа.

Надо учиться пользоваться Матлабом, а то симуляция различных вариантов много времени занимает sm.gif
Go to the top of the page
 
+Quote Post
Serg76
сообщение Dec 20 2012, 16:16
Сообщение #25


Профессионал
*****

Группа: Участник
Сообщений: 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 Гц. Вот что получилось:

до

Прикрепленное изображение


после

Прикрепленное изображение


вроде как требования выполняются sm.gif
Go to the top of the page
 
+Quote Post
alex_os
сообщение Dec 20 2012, 17:12
Сообщение #26


Знающий
****

Группа: Свой
Сообщений: 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 Гц. Вот что получилось:


Частоты неинтересные у Вас sm.gif. Интересно что получится если подать два синуса 6 кГц и 6.2 кГц...
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
ну не художники мы...
Go to the top of the page
 
+Quote Post
Serg76
сообщение Dec 20 2012, 18:19
Сообщение #27


Профессионал
*****

Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775



Цитата(alex_os @ Dec 20 2012, 21:12) *
Частоты неинтересные у Вас sm.gif. Интересно что получится если подать два синуса 6 кГц и 6.2 кГц...

пожалуйста

Прикрепленное изображение
Go to the top of the page
 
+Quote Post
evil_laugh
сообщение Dec 20 2012, 18:35
Сообщение #28


Участник
*

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



Serg76, похоже, Вы познали Дао. У меня только один вопрос: КАК? sm.gif Можно, пожалуйста, подробнее про алгоритм? sm.gif
Go to the top of the page
 
+Quote Post
Serg76
сообщение Dec 20 2012, 18:54
Сообщение #29


Профессионал
*****

Группа: Участник
Сообщений: 1 050
Регистрация: 4-04-07
Пользователь №: 26 775



Цитата(evil_laugh @ Dec 20 2012, 22:35) *
Serg76, похоже, Вы познали Дао. У меня только один вопрос: КАК? sm.gif Можно, пожалуйста, подробнее про алгоритм? sm.gif

да как и описывал выше на основе полифазника, здесь ничего сверхестественного, правильно подберите нужное окно. я взял распространенное Наттала, правда пришлось все-таки увеличить порядок фильтра до 300, вроде как в -70 дБ влезли (пардон, -60 дБ) sm.gif А вообще, -60 дБ - это еще по-Божески, где-то попадалось на просторах Инета ресамплер как раз звукового диапазона с подавлением чуть ли не -120 дБ.

Сообщение отредактировал Serg76 - Dec 20 2012, 19:02
Go to the top of the page
 
+Quote Post
evil_laugh
сообщение Dec 20 2012, 19:03
Сообщение #30


Участник
*

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



Цитата(Serg76 @ Dec 20 2012, 21:54) *
да как и описывал выше на основе полифазника, здесь ничего сверхестественного, правильно подберите нужное окно. я взял распространенное Наттала, правда пришлось все-таки увеличить порядок фильтра до 300, вроде как в -70 дБ влезли (пардон, -60 дБ) sm.gif

То есть Вы делаете простую однокаскадную передискретизацию, но с таким вот хитрым фильтром? А на какую частоту дискретизации фильтр считался? Я так понимаю, Вы не делали "честное" повышение частоты дискретизации до 44100*128, а сделали как-то по-другому? А как?
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th June 2025 - 19:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01525 секунд с 7
ELECTRONIX ©2004-2016