В этом примере показано, как проектировать фильтры FIR нижних частот. Многие из представленных здесь концепций могут быть расширены на другие ответы, такие как высокий канал, полосовой канал и т.д.
Фильтры FIR широко используются благодаря мощным алгоритмам проектирования, которые существуют для них, присущей им стабильности при реализации в нерекурсивной форме, легкости, с которой можно достичь линейной фазы, их простой расширяемости до многоскоростных случаев, и широкой аппаратной поддержке, которая существует для них среди других причин. В этом примере демонстрируются функциональные возможности системы DSP, Toolbox™ для проектирования низкочастотных КИХ-фильтров с различными характеристиками.
Lowpass Filter Design в MATLAB предоставляет обзор проектирования фильтров нижних частот с помощью DSP System Toolbox. Таким образом, представлены две функции, которые возвращают вектор коэффициентов КИХ-фильтра: firceqrip и firgr. firceqrip используется, когда порядок фильтра (эквивалентная длина фильтра) известен и фиксирован.
N = 100; % FIR filter order Fp = 20e3; % 20 kHz passband-edge frequency Fs = 96e3; % 96 kHz sampling frequency Rp = 0.00057565; % Corresponds to 0.01 dB peak-to-peak ripple Rst = 1e-4; % Corresponds to 80 dB stopband attenuation eqnum = firceqrip(N,Fp/(Fs/2),[Rp Rst],'passedge'); % eqnum = vec of coeffs fvtool(eqnum,'Fs',Fs,'Color','White') % Visualize filter

Выбор порядка фильтра 100 был произвольным. В общем, больший порядок приводит к лучшему приближению к идеалу за счет более дорогостоящей реализации. Удвоение порядка примерно уменьшает ширину перехода фильтра пополам (при условии, что все остальные параметры остаются прежними).
N2 = 200; % Change filter order from 100 to 200 eqNum200 = firceqrip(N2,Fp/(Fs/2),[Rp Rst],'passedge'); fvt = fvtool(eqnum,1,eqNum200,1,'Fs',Fs,'Color','White'); legend(fvt,'FIR filter; Order = 100','FIR filter. Order = 200')

Вместо указания порядка фильтрации, firgr может использоваться для определения минимального заказа, необходимого для соответствия проектным спецификациям. Для этого необходимо указать ширину переходной области. Это делается путем установки граничной частоты полосы останова.
Fst = 23e3; % Transition Width = Fst - Fp numMinOrder = firgr('minorder',[0,Fp/(Fs/2),Fst/(Fs/2),1],[1 1 0 0],... [Rp Rst]); fvt = fvtool(eqnum,1,eqNum200,1,numMinOrder,1,'Fs',Fs,'Color','White'); legend(fvt,'FIR filter; Order = 100','FIR filter. Order = 200',... 'FIR filter. Order = 133')

Также можно проектировать фильтры минимального чётного порядка ('mineven') или минимального нечётного порядка ('minodd') через firgr функция.
Как только коэффициенты фильтра получены, фильтр может быть реализован с помощью dsp.FIRFilter. Это поддерживает данные с плавающей запятой двойной/одинарной точности, а также данные с фиксированной запятой. Он также поддерживает генерацию кода C и HDL, а также оптимизированную генерацию кода для ARM ® Cortex ® M и ARM Cortex A.
lowpassFIR = dsp.FIRFilter('Numerator',eqnum); %or eqNum200 or numMinOrder fvtool(lowpassFIR,'Fs',Fs,'Color','White')

Чтобы выполнить фактическую фильтрацию, вызовите FIR прямо как функцию. Следующий код фильтрует гауссовский белый шум и показывает результирующий отфильтрованный сигнал в анализаторе спектра в течение 10 секунд.
scope = dsp.SpectrumAnalyzer('SampleRate',Fs,'SpectralAverages',5); tic while toc < 10 x = randn(256,1); y = lowpassFIR(x); scope(y); end

Для удобства проектирование и внедрение фильтра может быть выполнено за один шаг с использованием dsp.LowpassFilter. Это также поддерживает оптимизацию с плавающей запятой, фиксированной запятой, C-кода и ARM Cortex M и ARM Cortex A.
lowpassFilt = dsp.LowpassFilter('DesignForMinimumOrder',false, ... 'FilterOrder',N,'PassbandFrequency',Fp,'SampleRate',Fs,... 'PassbandRipple',0.01, 'StopbandAttenuation',80); tic while toc < 10 x = randn(256,1); y = lowpassFilt(x); scope(y); end

Обратите внимание, что для удобства спецификации вводятся непосредственно с использованием значений дБ. Пульсацию полосы пропускания можно проверить, выбрав меню «View» в FVTool, а затем выбрав «Passband». dsp.LowpassFilter может также использоваться для БИХ (биквад) конструкций.
fvtool(lowpassFilt,'Fs',Fs,'Color','White')

Коэффициенты фильтра могут быть извлечены из dsp.LowpassFilter с помощью tf функция.
eqnum = tf(lowpassFilt);
Фильтры FIR нижних частот, в которых частота отсечки может быть настроена во время выполнения, могут быть реализованы с помощью «» dsp.VariiveBandwidthFIRFilter «». Эти фильтры не обеспечивают такую же гранулярность управления характеристикой отклика фильтра, но они допускают динамическую частотную характеристику.
vbwFilter = dsp.VariableBandwidthFIRFilter('CutoffFrequency',1e3); tic told = 0; while toc < 10 t = toc; if floor(t) > told % Add 1 kHz every second vbwFilter.CutoffFrequency = vbwFilter.CutoffFrequency + 1e3; end x = randn(256,1); y = vbwFilter(x); scope(y); told = floor(t); end

До сих пор все использованные конструкции были оптимальными. Конструкции Equiripple достигают оптимальности, равномерно распределяя отклонение от идеального отклика. Это имеет преимущество минимизации максимального отклонения (пульсации). Однако общее отклонение, измеренное с точки зрения его энергии, имеет тенденцию быть большим. Это не всегда может быть желательным. Когда низкочастотная фильтрация сигнала, это подразумевает, что остаточная энергия сигнала в полосе останова может быть относительно большой. Когда это является проблемой, методы наименьших квадратов обеспечивают оптимальные конструкции, которые минимизируют энергию в полосе останова. fdesign.lowpass может использоваться для проектирования наименьших квадратов и других видов фильтров нижних частот. Следующий код сравнивает конструкцию FIR методом наименьших квадратов с конструкцией equiripple FIR с тем же порядком фильтра и шириной перехода:
lowpassSpec = fdesign.lowpass('N,Fp,Fst',133,Fp,Fst,Fs); lsFIR = design(lowpassSpec,'firls','SystemObject',true); LP_MIN = dsp.FIRFilter('Numerator',numMinOrder); fvt = fvtool(LP_MIN,lsFIR,'Fs',Fs,'Color','White'); legend(fvt,'Equiripple design','Least-squares design')

Обратите внимание, как затухание в полосе останова увеличивается с частотой для конструкций с наименьшими квадратами, в то время как оно остается постоянным для конструкции с равными углами. Повышенное затухание в случае наименьших квадратов минимизирует энергию в этой полосе сигнала, подлежащего фильтрации.
Часто нежелательным эффектом конструкций с наименьшими квадратами является то, что пульсация в области полосы пропускания вблизи края полосы пропускания имеет тенденцию быть большой. Для фильтров нижних частот в общем случае желательно, чтобы частоты полосы пропускания фильтруемого сигнала влияли как можно меньше. В этой степени обычно предпочтительна равнодействующая полоса пропускания. Если по-прежнему желательно иметь увеличивающееся затухание в полосе останова, то равноудаленные варианты конструкции обеспечивают способ достижения этого.
FIR_eqrip_slope = design(lowpassSpec,'equiripple','StopbandShape','1/f',... 'StopbandDecay',4,'SystemObject',true); fvt = fvtool(lsFIR,FIR_eqrip_slope,'Fs',Fs,'Color','White'); legend(fvt,'Least-squares design',... 'Equiripple design with stopband decaying as (1/f)^4')

Обратите внимание, что стопорные полосы очень похожи. Однако конструкция equiripple имеет значительно меньшую пульсацию полосы пропускания вблизи граничной частоты полосы пропускания, 20 кГц:
mls = measure(lsFIR); meq = measure(FIR_eqrip_slope); mls.Apass meq.Apass
ans =
0.0121
ans =
0.0046
Еще одна возможность состоит в том, чтобы использовать произвольную спецификацию величины и выбрать две полосы (одну для полосы пропускания и одну для полосы останова). Затем, используя веса для второй полосы, можно увеличить затухание по всей полосе. Дополнительные сведения об этой и других конструкциях произвольной величины см. в разделе Конструкция фильтра произвольной величины.
B = 2; % Number of bands F = [0 Fp linspace(Fst,Fs/2,40)]; A = [1 1 zeros(1,length(F)-2)]; W = linspace(1,100,length(F)-2); lowpassArbSpec = fdesign.arbmag('N,B,F,A',N,B,F(1:2),A(1:2),F(3:end), ... A(3:end),Fs); lpfilter = design(lowpassArbSpec,'equiripple','B2Weights',W, ... 'SystemObject',true); fvtool(lpfilter,'Fs',Fs,'Color','White');

До сих пор мы рассматривали только линейно-фазовые конструкции. Линейная фаза желательна во многих применениях. Тем не менее, если линейная фаза не является обязательным требованием, конструкции с минимальной фазой могут обеспечить значительные улучшения по сравнению с аналогами линейной фазы. Однако конструкции с минимальной фазой не всегда являются устойчивыми в числовом отношении. Всегда проверяйте конструкцию с помощью FVTool.
В качестве примера преимуществ конструкций с минимальной фазой рассмотрим сравнение конструкции с линейной фазой с конструкцией с минимальной фазой, которая соответствует тем же спецификациям конструкции:
Fp = 20e3; Fst = 22e3; Fs = 96e3; Ap = 0.06; Ast = 80; lowpassSpec = fdesign.lowpass('Fp,Fst,Ap,Ast',Fp,Fst,Ap,Ast,Fs); linphaseSpec = design(lowpassSpec,'equiripple','SystemObject',true); eqripSpec = design(lowpassSpec,'equiripple','minphase',true,... 'SystemObject',true); fvt = fvtool(linphaseSpec,eqripSpec,'Fs',Fs,... 'Color','White'); legend(fvt,... 'Linear-phase equiripple design',... 'Minimum-phase equiripple design')

Обратите внимание, что количество коэффициентов уменьшено со 173 до 141. График задержки группы также показывает преимущества конструкции с минимальной фазой. Обратите внимание, что задержка группы намного меньше (в частности, в области полосы пропускания).
fvt = fvtool(linphaseSpec,eqripSpec,'Fs',Fs,... 'Analysis','grpdelay','Color','White'); legend(fvt,... 'Linear-phase equiripple design',... 'Minimum-phase equiripple design')

Другой подход к минимизации числа коэффициентов, который не включает в себя минимально фазовые конструкции, заключается в использовании многоступенчатых методов. Здесь мы показываем интерполированный подход FIR (IFIR). Этот подход разбивает проблему проектирования на проектирование двух фильтров в каскаде. Для этого примера конструкция требует 151 коэффициент, а не 173. Дополнительные сведения см. в разделе Проектирование фильтра произвольной величины.
Fp = 20e3; Fst = 22e3; Fs = 96e3; Ap = 0.06; Ast = 80; lowpassSpec = fdesign.lowpass('Fp,Fst,Ap,Ast',Fp,Fst,Ap,Ast,Fs); interpFilter = design(lowpassSpec,'ifir','SystemObject',true); cost(interpFilter) fvt = fvtool(linphaseSpec,interpFilter,'Fs',Fs,'Color','White'); legend(fvt,... 'Linear-phase equiripple design',... 'Interpolated FIR equiripple design (two stages)')
ans =
struct with fields:
NumCoefficients: 151
NumStates: 238
MultiplicationsPerInputSample: 151
AdditionsPerInputSample: 149

В этом случае график задержки группы выявляет недостатки конструкции IFIR. Хотя конструкции IFIR действительно обеспечивают линейную фазу, групповая задержка обычно больше, чем сравнимая одноступенчатая конструкция.
fvt = fvtool(linphaseSpec,interpFilter,'Fs',Fs,'Analysis','grpdelay',... 'Color','White'); legend(fvt,... 'Linear-phase equiripple design',... 'Interpolated FIR equiripple design (two stages)')

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