exponenta event banner

Проектирование фильтров ПИХ нижних частот

В этом примере показано, как проектировать фильтры 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 функция.

Реализация фильтра FIR нижних частот

Как только коэффициенты фильтра получены, фильтр может быть реализован с помощью 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 нижних частот

Фильтры 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')

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

Конструкции Equiripple с увеличением затухания полосы останова

Часто нежелательным эффектом конструкций с наименьшими квадратами является то, что пульсация в области полосы пропускания вблизи края полосы пропускания имеет тенденцию быть большой. Для фильтров нижних частот в общем случае желательно, чтобы частоты полосы пропускания фильтруемого сигнала влияли как можно меньше. В этой степени обычно предпочтительна равнодействующая полоса пропускания. Если по-прежнему желательно иметь увеличивающееся затухание в полосе останова, то равноудаленные варианты конструкции обеспечивают способ достижения этого.

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)')

Разработка фильтра нижних частот для многоскоростных приложений

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