Практический дизайн фильтра для пихты: часть 1 - дизайн с октавой или матлабом

Практический дизайн фильтра для пихты: часть 1 - дизайн с октавой или матлабом
Практический дизайн фильтра для пихты: часть 1 - дизайн с октавой или матлабом
Anonim

Практический дизайн КИХ-фильтра: Часть 1 - Дизайн с октавой или Matlab

В этом учебном пособии основное внимание будет уделено разработке фильтра с конечной импульсной характеристикой (FIR). По мере продвижения серии он обсудит необходимые шаги по внедрению фильтра на реальном оборудовании.

FIR-фильтр - это цифровой фильтр, импульсный отклик которого устанавливается на нуль за конечное время, в отличие от бесконечного фильтра импульсной характеристики (IIR), который использует обратную связь и может бесконечно реагировать на входной сигнал. Самое замечательное в фильтрах FIR заключается в том, что они являются по своей сути устойчивой и может быть легко рассчитана на линейную фазу. Я больше не буду подробно разбираться в фильтрах FIR и их профи и консолях, поскольку в этом учебном пособии основное внимание уделяется разработке фильтров быстро и эффективно с помощью Octave.

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

$$ N \ approx \ frac {A_ {dB} F_ {s}} {22 \ Delta f} $$

где

$$ A_ {дБ} $$ - это затухание затухания в дБ

$$ F_ {s} $$ - ваша частота выборки

а также

$$ \ Delta f $$ - ваша пропускная способность

Допустим, мы хотим отфильтровать аудиосигнал со следующими характеристиками и требуемым ответом фильтра:

- Образцы могут содержать частоты от 0 до 20 кГц

- Мы хотим создать фильтр, который пропускает только частоты менее 10 кГц

- Мы хотим, чтобы затухание затухания составляло 40 дБ при 15 кГц

- Наша система имеет $$ F_ {s} $$ 192 кГц

С помощью этой информации мы можем начать процесс проектирования. Используя уравнение для N, мы оценим длину фильтра примерно так:

$$ N \ approx \ frac {(40) (192000Hz)} {22 (15kHz - 10kHz)} $$

$$ N \ approx 69.818 $$

округление до ближайшего нечетного числа

$$ N \ approx 69 $$

* Проектирование длины фильтра FIR для нечетной длины даст фильтру интегральную задержку (N-1) / 2.

Используя код Octave / Matlab ниже, мы можем увидеть, как создать фильтр нижних частот с полосой пропускания 10 кГц и отсечкой 15 кГц, используя встроенную функцию fir1 Octave, которая хорошо документирована здесь


close all; clear all; clf; f1 = 10000; f2 = 15000; delta_f = f2-f1; Fs = 192000; dB = 40; N = dB*Fs/(22*delta_f); f = (f1)/(Fs/2) hc = fir1(round(N)-1, f, 'low') figure plot((-0.5:1/4096:0.5-1/4096)*Fs, 20*log10(abs(fftshift(fft(hc, 4096))))) axis((0 20000 -60 20)) title('Filter Frequency Response') grid on

Код Octave / Matlab

Вышеприведенный код дает нам следующий ответ:

Image
Image

Рисунок 1

Но если мы увеличим масштаб, мы увидим, что ослабление на 10 кГц больше, чем 3dB:

Image
Image

\

фигура 2

Полоса пропускания фильтра всегда указывается на -3 дБ, поэтому на первой итерации дизайна наш фильтр имеет меньшую полосу пропускания, чем указано (где-то менее 9 кГц). Из первого рисунка видно, что затухание в полосе пропускания превысило наши характеристики, возможно, мы можем настроить частоту затухания и полосы пропускания для улучшения дизайна.

Тонкая настройка параметров в коде

f1 = 11200;

f2 = 15000;

дБ = 30;

дает нам фильтр, который точно соответствует нашим специальностям

Image
Image

Рисунок 3

Теперь дизайн фильтра завершен. Давайте имитируем, как это работает, добавив код ниже в первый бит кода, на который мы смотрели.


x = sin(2*pi*(1:1000)*5000/Fs) + sin(2*pi*(1:1000)*2000/Fs) + sin(2*pi*(1:1000)*13000/Fs) + sin(2*pi*(1:1000)*18000/Fs); sig = 20*log10(abs(fftshift(fft(x, 4096)))); xf = filter(hc, 1, x) figure subplot(211) plot(x) title('Sinusoid with frequency components 2000, 5000, 13000, and 18000 Hz') subplot(212) plot(xf) title('Filtered Signal') xlabel('time') ylabel('amplitude') x= (x/sum(x))/20 sig = 20*log10(abs(fftshift(fft(x, 4096)))); xf = filter(hc, 1, x) figure subplot(211) plot((-0.5:1/4096:0.5-1/4096)*Fs, sig) hold on plot((-0.5:1/4096:0.5-1/4096)*Fs, 20*log10(abs(fftshift(fft(hc, 4096)))), 'color', 'r') hold off axis((0 20000 -60 10)) title('Input to filter - 4 Sinusoids') grid on subplot(212) plot((-0.5:1/4096:0.5-1/4096)*Fs, 20*log10(abs(fftshift(fft(xf, 4096))))) axis((0 20000 -60 10)) title('Output from filter') xlabel('Hz') ylabel('dB') grid on

Больше кода Matlab / Octave

Image
Image

Рисунок 4

Как мы видим на рисунке 4, у нас есть сигналы временной области слева и частотная область справа. Фильтр (красным) накладывается на график, чтобы показать, как фильтр покидает синусоиды в полосе пропускания и ослабляет сигналы в переходном и стоповом диапазонах.

Функция fir1 также может использоваться для создания режекторных фильтров, фильтров высоких частот и полосовых фильтров путем замены этих линий:

f = (f1) / (Fs / 2), возможно, необходимо указать два аргумента для фильтров полосового и выреза:

f = (f1 f2) / (Fs / 2), где f1 - левый край -3dB, а f2 - правый край 3dB

hc = fir1 (round (N) -1, f, 'low') могут быть изменены как таковые:

«low» можно заменить на «stop» (выемка), «высокий» (highpass), «bandpass» (полоса пропускания)

Из демонстрации нижнего фильтра выше должно быть легко сформировать коэффициенты (это переменная hc в коде) для любого желаемого фильтра. После вычисления коэффициентов важно масштабировать и квантовать их, чтобы вы могли реализовать свой фильтр в микропроцессоре. В части 2 мы рассмотрим масштабирование коэффициентов и другие шаги, необходимые для перевода ваших коэффициентов в N-разрядный микропроцессор. Это важно, потому что без правильного масштабирования вы испытаете шум quanitization, который повлияет на частотную характеристику фильтра. Следовательно, ваш дизайн не будет соответствовать вашей оригинальной спецификации или выводам, которые вы имитировали в Octave.

Следующая статья в серии: Практический дизайн КИХ-фильтра: Часть 2 - Реализация фильтра