Разработка низкочастотных конечных импульсных характеристик фильтров

Этот пример показывает, как проектировать lowpass конечная импульсная характеристика. Многие из представленных здесь концепций могут быть распространены на другие ответы, такие как highpass, bandpass и т.д.

Конечная импульсная характеристика широко используются из-за мощных алгоритмов проекта, которые существуют для них, их неотъемлемой устойчивости при реализации в нерекурсивной форме, легкости, с которой можно достичь линейной фазы, их простой расширяемости для мультирейта случаев и достаточной аппаратной поддержки, которая существует по ним среди других причин. Этот пример демонстрирует функциональность в DSP System Toolbox™ для проекта lowpass конечной импульсной характеристики фильтров с различными характеристиками.

Получение Lowpass конечных импульсных характеристик

Lowpass Filter Design в MATLAB предоставляет обзор разработки lowpass-фильтров с 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')

Минимальный порядок Lowpass Создания фильтра

Вместо того, чтобы определять порядок фильтра, 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 функция.

Реализация Lowpass конечной импульсной характеристики

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

В порядок выполнения фактической фильтрации вызовите конечную импульсную характеристику непосредственно как функцию. Следующий код фильтрует Гауссов белый шум и показывает полученный фильтрованный сигнал в анализаторе спектра в течение 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);

Настраиваемые Lowpass конечная импульсная характеристика

Lowpass конечная импульсная характеристика, в которых частота отключения может быть настроена во время выполнения, могут быть реализованы с помощью 'dsp.VariableBandwidthFIRFilter'. Эти фильтры не обеспечивают ту же гранулярность управления характеристикой характеристики фильтра, но они допускают динамическую частотную характеристику.

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

Расширенные Опции Проекта: Оптимальные Неравновесные Lowpass Фильтры

До сих пор все используемые проекты были оптимальными проектами равновесия. Проекты Equiripple достигают оптимальности, распределяя отклонение от идеальной характеристики равномерно. Это имеет преимущество минимизации максимального отклонения (пульсации). Однако общее отклонение, измеренное в терминах его энергии, имеет тенденцию быть большим. Это не всегда может быть желательно. Когда lowpass фильтрация сигнала, это подразумевает, что остаточная энергия сигнала в полосе остановки может быть относительно большой. Когда это является проблемой, методы наименьших квадратов обеспечивают оптимальные проекты, которые минимизируют энергию в полосе упора. fdesign.lowpass может использоваться для разработки фильтров методом наименьших квадратов и других видов lowpass. Следующий код сравнивает проект конечной импульсной характеристики методом наименьших квадратов с проектом равновесия конечной импульсной характеристики с тем же порядком фильтра и шириной перехода:

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. Увеличение ослабления в случае наименьших квадратов минимизирует энергию в той полосе сигнала, который будет фильтроваться.

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

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

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

Минимально-фазовый Lowpass Создания фильтра

Пока мы рассматривали только линейно-фазовые проекты. Линейная фаза желательна во многих приложениях. Тем не менее, если линейная фаза не является обязательной, минимально-фазовые проекты могут обеспечить значительные улучшения по сравнению с линейно-фазовыми аналогами. Однако проекты с минимальной фазой не всегда являются численно устойчивыми. Всегда проверяйте проект с помощью 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')

Lowpass минимального порядка Создания фильтра с использованием многоступенчатых методов

Другой подход к минимизации количества коэффициентов, который не включает минимально-фазовые проекты, состоит в том, чтобы использовать многоступенчатые методы. Здесь мы покажем интерполированный подход конечной импульсной характеристики (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)')

Lowpass Filter Design для многопоточных приложений

Lowpass широко используются в проекте дециматоров и интерполяторов. Смотрите Design of Decimators and Interpolators для получения дополнительной информации об этом и Multistage Design Of Decimators/Interpolators для многоступенчатых методов, которые приводят к очень эффективным реализациям.