Создание фильтра lowpass в MATLAB

В этом примере показано, как спроектировать фильтры lowpass. Пример подсвечивает некоторые обычно используемые инструменты командной строки в DSP System Toolbox™. В качестве альтернативы можно использовать приложение Filter Builder, чтобы реализовать все проекты, представленные здесь. Для большего количества проектных решений смотрите Разработку Низкие КИХ-Фильтры Передачи.

Введение

При разработке фильтра lowpass предпочтительный выбор, который вы делаете, состоит в том, спроектировать ли БИХ-фильтр или КИХ. Вы обычно выбираете фильтры FIR, когда линейный фазовый отклик важен. КИХ-фильтры также имеют тенденцию быть предпочтенными для реализаций фиксированной точки, потому что они обычно более устойчивы к эффектам квантования. КИХ-фильтры также используются во многих высокоскоростных реализациях, таких как FPGAs или ASICs, потому что они подходят для конвейеризации. БИХ-фильтры (в конкретных фильтрах biquad) используются в приложениях (таких как обработка звукового сигнала), где линейность фазы не является беспокойством. БИХ-фильтры обычно в вычислительном отношении более эффективны в том смысле, что они могут выполнить техническим требованиям проекта с меньшим количеством коэффициентов, чем КИХ-фильтры. БИХ-фильтры также имеют тенденцию иметь более короткий переходный процесс и меньшую групповую задержку. Однако использование минимальной фазы и многоскоростных проектов может привести к КИХ-фильтрам, сопоставимым с БИХ-фильтрами в терминах групповой задержки и вычислительного КПД.

КИХ проекты Lowpass - определение порядка фильтра

Существует много практических ситуаций, в которых необходимо задать порядка фильтра. Один такой случай - то, если вы предназначаетесь для оборудования, которое ограничило порядка фильтра к определенному номеру. Другой общий сценарий - когда вы вычислили доступный вычислительный бюджет (MIPS) для вашей реализации, и это предоставляет вам ограниченного порядка фильтра. КИХ-проект функционирует в Signal Processing Toolbox (включая fir1, firpm, и firls) все способны к разработке фильтров lowpass с заданным порядком. В DSP System Toolbox предпочтительной функцией для КИХ-создания фильтра lowpass с заданным порядком является firceqrip. Эта функция проектирует оптимальный equiripple lowpass/highpass КИХ-фильтры с заданными значениями пульсации полосы пропускания/полосы задерживания и с заданной частотой ребра полосы пропускания. Частота ребра полосы задерживания определяется в результате проекта.

Спроектируйте КИХ-фильтр lowpass для данных, произведенных на уровне 48 кГц. Частота ребра полосы пропускания составляет 8 кГц. Неравномерность в полосе пропускания составляет 0,01 дБ, и затухание в полосе задерживания составляет 80 дБ. Ограничьте порядка фильтра к 120.

N = 120;
Fs = 48e3;
Fp = 8e3;
Ap = 0.01;
Ast = 80;

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

Rp = (10^(Ap/20) - 1)/(10^(Ap/20) + 1);
Rst = 10^(-Ast/20);

Спроектируйте фильтр с помощью firceqrip и просмотрите частотную характеристику величины.

NUM = firceqrip(N,Fp/(Fs/2),[Rp Rst],'passedge');
fvtool(NUM,'Fs',Fs)

Получившаяся частота ребра полосы задерживания составляет приблизительно 9,64 кГц.

Проекты минимального порядка

Другой функцией проекта для оптимальных фильтров equiripple является firgr. firgr может спроектировать фильтр, который соответствует ограничениям пульсации полосы пропускания/полосы задерживания, а также заданной ширине перехода с самым маленьким порядком фильтра. Например, если частота ребра полосы задерживания задана как 10 кГц, получившийся фильтр имеет порядок 100, а не фильтр 120-го порядка, спроектированный с firceqrip. Меньший порядок фильтра следует из более многочисленной полосы перехода.

Задайте частоту ребра полосы задерживания 10 кГц. Получите КИХ-фильтр минимального порядка с неравномерностью в полосе пропускания 0,01 дБ и 80 дБ затухания в полосе задерживания.

Fst = 10e3;
NumMin = firgr('minorder',[0 Fp/(Fs/2) Fst/(Fs/2) 1],...
    [1 1 0 0],[Rp,Rst]);

Постройте частотные характеристики величины для КИХ-фильтра минимального порядка, полученного с firgr и фильтр 120-го порядка спроектирован с firceqrip. Проект минимального порядка приводит к фильтру с порядком 100. Область перехода фильтра 120-го порядка является, как ожидалось, более узкой, чем тот из фильтра с порядком 100.

hvft = fvtool(NUM,1,NumMin,1,'Fs',Fs);
legend(hvft,'N = 120','N = 100')

Фильтрация данных

Чтобы применить фильтр к данным, можно использовать filter команда или вы можете использовать dsp.FIRFilter. dsp.FIRFilter имеет преимущество состояния управления, когда выполняется в цикле. dsp.FIRFilter также имеет возможности фиксированной точки и поддерживает генерацию кода C, генерацию HDL-кода и генерацию оптимизированного кода для ARM® Cortex® M и Коры ARM A.

Отфильтруйте 10 секунд белого шума с нулевым средним значением и модульным стандартным отклонением в системах координат 256 выборок с КИХ 120-го порядка фильтр lowpass. Просмотрите результат на спектре анализатор.

LP_FIR = dsp.FIRFilter('Numerator',NUM);
SA = dsp.SpectrumAnalyzer('SampleRate',Fs,...
    'SpectralAverages',5);
tic
while toc < 10
    x = randn(256,1);
    y = LP_FIR(x);
    step(SA,y);
end

Используя dsp.LowpassFilter

dsp.LowpassFilter альтернатива использованию firceqrip и firgr в сочетании с dsp.FIRFilter. В основном, dsp.LowpassFilter уплотняет два процесса шага в один. dsp.LowpassFilter обеспечивает те же преимущества что dsp.FIRFilter обеспечивает в терминах поддержки фиксированной точки, поддержки генерации кода C, поддержки генерации HDL-кода и поддержки генерации кода Коры ARM.

Спроектируйте КИХ-фильтр lowpass для данных, произведенных на уровне 48 кГц. Частота ребра полосы пропускания составляет 8 кГц. Неравномерность в полосе пропускания составляет 0,01 дБ, и затухание в полосе задерживания составляет 80 дБ. Ограничьте порядка фильтра к 120. Создайте dsp.FIRFilter на основе ваших технических требований.

LP_FIR = dsp.LowpassFilter('SampleRate',Fs,...
    'DesignForMinimumOrder',false,'FilterOrder',N,...
    'PassbandFrequency',Fp,...
    'PassbandRipple',Ap,'StopbandAttenuation',Ast);

Коэффициенты в LP_FIR идентичны коэффициентам в NUM.

NUM_LP = tf(LP_FIR);

Можно использовать LP_FIR отфильтровать данные непосредственно, как показано в предыдущем примере. Можно также анализировать фильтр с помощью FVTool или измерить ответ с помощью measure.

fvtool(LP_FIR,'Fs',Fs);
measure(LP_FIR)
ans = 

Sample Rate      : 48 kHz    
Passband Edge    : 8 kHz     
3-dB Point       : 8.5843 kHz
6-dB Point       : 8.7553 kHz
Stopband Edge    : 9.64 kHz  
Passband Ripple  : 0.01 dB   
Stopband Atten.  : 79.9981 dB
Transition Width : 1.64 kHz  
 

Проекты минимального порядка с dsp.LowpassFilter

Можно использовать dsp.LowpassFilter спроектировать фильтры минимального порядка и использовать measure проверять, что проект выполняет предписанным техническим требованиям. Порядок фильтра равняется снова 100.

LP_FIR_minOrd = dsp.LowpassFilter('SampleRate',Fs,...
    'DesignForMinimumOrder',true,...
    'PassbandFrequency',Fp,...
    'StopbandFrequency',Fst,...
    'PassbandRipple',Ap,...
    'StopbandAttenuation',Ast);
measure(LP_FIR_minOrd)
Nlp = order(LP_FIR_minOrd)
ans = 

Sample Rate      : 48 kHz      
Passband Edge    : 8 kHz       
3-dB Point       : 8.7136 kHz  
6-dB Point       : 8.922 kHz   
Stopband Edge    : 10 kHz      
Passband Ripple  : 0.0098641 dB
Stopband Atten.  : 80.122 dB   
Transition Width : 2 kHz       
 

Nlp =

   100

Разработка БИХ-фильтров

Эллиптические фильтры являются БИХ-дубликатом к оптимальным equiripple КИХ-фильтрам. Соответственно, можно использовать те же технические требования, чтобы спроектировать эллиптические фильтры. Порядок фильтра, которого вы получаете для БИХ-фильтра, намного меньше, чем порядок соответствующего КИХ-фильтра.

Спроектируйте эллиптический фильтр с той же частотой дискретизации, частотой среза, ограничением неравномерности в полосе пропускания и затуханием в полосе задерживания как КИХ-фильтр 120-го порядка. Уменьшайте порядка фильтра для эллиптического фильтра к 10.

N = 10;
LP_IIR = dsp.LowpassFilter('SampleRate',Fs,...
    'FilterType','IIR',...
    'DesignForMinimumOrder',false,...
    'FilterOrder',N,...
    'PassbandFrequency',Fp,...
    'PassbandRipple',Ap,...
    'StopbandAttenuation',Ast);

Сравните БИХ-проекты и КИХ. Вычислите стоимость этих двух реализаций.

hfvt = fvtool(LP_FIR,LP_IIR,'Fs',Fs);
legend(hfvt,'FIR Equiripple, N = 120',...
    'IIR Elliptic, N = 10');
cost_FIR = cost(LP_FIR)
cost_IIR = cost(LP_IIR)
cost_FIR = 

  struct with fields:

                  NumCoefficients: 121
                        NumStates: 120
    MultiplicationsPerInputSample: 121
          AdditionsPerInputSample: 120


cost_IIR = 

  struct with fields:

                  NumCoefficients: 25
                        NumStates: 20
    MultiplicationsPerInputSample: 25
          AdditionsPerInputSample: 20

КИХ и БИХ-фильтры имеют подобные ответы величины. Стоимость БИХ-фильтра является о 1/6 стоимостью КИХ-фильтра.

Выполнение БИХ-фильтров

БИХ-фильтр спроектирован как фильтр biquad. Чтобы применить фильтр к данным, используйте те же команды в качестве в КИХ-случае.

Отфильтруйте 10 секунд белого Гауссова шума с нулевым средним значением и модульным стандартным отклонением в системах координат 256 выборок с БИХ 10-го порядка фильтр lowpass. Просмотрите результат на спектре анализатор.

SA = dsp.SpectrumAnalyzer('SampleRate',Fs,...
    'SpectralAverages',5);
tic
while toc < 10
    x = randn(256,1);
    y = LP_IIR(x);
    SA(y);
end

Переменный КИХ полосы пропускания и БИХ-фильтры

Можно также спроектировать фильтры, которые позволяют вам изменять частоту среза во времени выполнения. dsp.VariableBandwidthFIRFilter и dsp.VariableBandwidthIIRFilter может использоваться для таких случаев.

Похожие темы