Разработка низких КИХ-фильтров передачи

Этот пример показывает, как разработать lowpass КИХ-фильтры. Многие концепции, представленные здесь, могут быть расширены к другим ответам, таким как highpass, полоса пропускания, и т.д.

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

Получение КИХ-коэффициентов фильтра Lowpass

Проект Фильтра Lowpass предоставляет обзор разработки 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 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 M и Кору ARM оптимизация.

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 может также использоваться для БИХ (biquad) проекты.

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

Усовершенствованные проектные решения: оптимальные фильтры Non-Equiripple Lowpass

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

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

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

Часто нежелательный эффект проектов наименьших квадратов состоит в том, что пульсация в области полосы пропускания близко к ребру полосы пропускания имеет тенденцию быть большой. Поскольку lowpass фильтрует в целом, желательно, чтобы частоты полосы пропускания сигнала, который будет отфильтрован, были затронуты как можно меньше. До этой степени equiripple полоса пропускания обычно предпочтительна. Если все еще желательно иметь увеличивающееся затухание в полосе задерживания, 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');

Проект фильтра минимальной фазы 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 для многоскоростных приложений

Фильтры Lowpass экстенсивно используются в проекте decimators и интерполяторов. См. Проект Decimators/Interpolators для получения дополнительной информации об этом и Многоступенчатом Проекте Decimators/Interpolators для многоступенчатых методов тот результат в очень эффективных внедрениях.