Сбой Matlab firpm для больших массивов данных AFR

#matlab #equalizer

#matlab #эквалайзер

Вопрос:

Вот быстрый и грязный код для попытки создать высокоточный эквалайзер:

 bandPoints = 355;
for n = 1:bandPoints
         x = (n / (bandPoints   2));
         f = (x*x)*(22000-20) 20; % 20...22000
         freqs(n) = f;
         niqfreqs(n) = f/22050.0;
         amps(n) = 0;        
end

amps(bandPoints 1) = 0; % firpm needs even numbers
niqfreqs(bandPoints 1) = 1; % firpm needs even numbers

% set some point to have a high amplitude

amps(200) = 1;
fircfs = firpm(101,niqfreqs,amps);

[h,w] = freqz(fircfs,1,512);
plot(w/pi,abs(h));
legend('firpm Design')
  

но это дает мне

 Warning:
  *** FAILURE TO CONVERGE ***
  Probable cause is machine rounding error.
  

и все коэффициенты FIR равны 0.

Если я уменьшу параметр n со 101 до 91, firpm работает без ошибок, но частотная характеристика далека от желаемой. И, принимая во внимание, что я хочу рассчитать коэффициенты FIR для аппаратного модуля DSP FIR, который поддерживает до 12288 нажатий, как я могу заставить Matlab рассчитать необходимые коэффициенты? firpm Способен ли я это сделать или мне нужно использовать другой подход (обратный FFT) как в Matlab, так и позже в коде моего приложения C ?

Ответ №1:

О, похоже, алгоритм MP действительно не может справиться с этим, поэтому мне нужно какое-то другое решение:

http://www.eetimes.com/design/embedded/4212775/Designing-very-high-order-FIR-filters-with-zero-stuffing

Думаю, тогда мне придется придерживаться обратного БПФ.