В этом примере показано, как спроектировать фильтры lowpass. Пример подсвечивает некоторые обычно используемые инструменты командной строки в DSP System Toolbox™. В качестве альтернативы можно использовать приложение Filter Builder, чтобы реализовать все проекты, представленные здесь. Для большего количества проектных решений смотрите Разработку Низкие КИХ-Фильтры Передачи.
При разработке фильтра lowpass предпочтительный выбор, который вы делаете, состоит в том, спроектировать ли БИХ-фильтр или КИХ. Вы обычно выбираете фильтры FIR, когда линейный фазовый отклик важен. КИХ-фильтры также имеют тенденцию быть предпочтенными для реализаций фиксированной точки, потому что они обычно более устойчивы к эффектам квантования. КИХ-фильтры также используются во многих высокоскоростных реализациях, таких как FPGAs или ASICs, потому что они подходят для конвейеризации. БИХ-фильтры (в конкретных фильтрах biquad) используются в приложениях (таких как обработка звукового сигнала), где линейность фазы не является беспокойством. БИХ-фильтры обычно в вычислительном отношении более эффективны в том смысле, что они могут выполнить техническим требованиям проекта с меньшим количеством коэффициентов, чем КИХ-фильтры. БИХ-фильтры также имеют тенденцию иметь более короткий переходный процесс и меньшую групповую задержку. Однако использование минимальной фазы и многоскоростных проектов может привести к КИХ-фильтрам, сопоставимым с БИХ-фильтрами в терминах групповой задержки и вычислительного КПД.
Существует много практических ситуаций, в которых необходимо задать порядка фильтра. Один такой случай - то, если вы предназначаетесь для оборудования, которое ограничило порядка фильтра к определенному номеру. Другой общий сценарий - когда вы вычислили доступный вычислительный бюджет (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
спроектировать фильтры минимального порядка и использовать 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
может использоваться для таких случаев.