Практический дизайн КИХ-фильтра: Часть 2 - Реализация фильтра
В первой части мы сосредоточились на разработке цифрового фильтра в Octave / Matlab. В этом руководстве будут описаны шаги, необходимые для реализации вашего фильтра в реальном оборудовании.
Для справки, код из части 1 приведен ниже:
close all; clear all; clf; f1 = 11200; f2 = 15000; delta_f = f2-f1; Fs = 192000; dB = 30; 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
Из кода получаем коэффициенты фильтра. Это переменная «hc». Мы можем взглянуть на импульсную характеристику фильтра, построив переменную «hc»:

РИСУНОК 1
Предполагая некоторые предварительные знания DSP, напомним, что при обработке FIR он имеет топологию на рисунке 2 ниже. Импульсная характеристика - это всего лишь коэффициенты фильтра. Представьте, что вы передавали сигнал длительности одного раза с величиной 1 в x (n). Результатом будет просто тот импульс, касающийся каждого крана ($$ b_ {n} $$ на рисунке 2), создающий рис. 1 выше.

ФИГУРА 2
Где:
x (n) - Входной сигнал
$$ b_ {n} $$ - N-й коэффициент
$$ z ^ {- 1} $$ - delay
y (n) - выход фильтров
На рисунке 2 мы имеем представление о том, как FIR-фильтр просматривается в программном и аппаратном обеспечении. Нам нужно сохранить коэффициенты в нашем микропроцессоре и передать входные данные через эти краны и добавить их для получения нашего вывода. Важным шагом на пути внедрения ваших коэффициентов в аппаратное обеспечение является квантование и масштабирование. Когда мы вычислили наши коэффициенты в Octave, мы вычислили их с высокой точностью, что является следствием компьютера, используемого для их проектирования (32-64 бит). Когда мы квантуем их для некоторых N-разрядных процессоров для их реализации на некоторых аппаратных средствах, мы получаем ошибки округления. Эти ошибки округления могут влиять на временные и частотные характеристики цифрового фильтра, отклоняя их от идеальных значений.
Для наиболее впечатляющего примера можно сказать, что мы хотим реализовать этот проект на 8-битном микропроцессоре с фиксированной точкой. Нам нужно квантовать наши коэффициенты. Давайте сделаем это без масштабирования в первую очередь. Для квантования коэффициентов вычислить следующее:
$$ h_ {quantized} = floor (hc * 2 ^ 8) / (2 ^ 8) $$
Это даст нам 8-разрядные квантованные коэффициенты, которые мы можем сохранить в виде переменной типа float.
Добавьте следующий код для вычисления квантованных коэффициентов, ошибки квантования, спектра ошибок квантования и сравнения между частотным спектром, вычисленным в Octave, и который мы будем реализовывать на 8-разрядном микропроцессоре.
h_q1 = floor(hc*2^8)/2^8; q1 = h_q1 - hc; figure subplot(211) plot(q1) title('Quantization Error') subplot(212) plot((-0.5:1/4096:0.5-1/4096)*Fs, 20*log10(abs(fftshift(fft(q1, 4096))))) title('Quantization Error Spectrum') figure plot((-0.5:1/4096:0.5-1/4096)*Fs, 20*log10(abs(fftshift(fft(hc, 4096))))) hold on plot((-0.5:1/4096:0.5-1/4096)*Fs, 20*log10(abs(fftshift(fft(h_q1, 4096)))), 'color', 'r') grid on axis((-Fs/2 Fs/2 -140 5)) title('Frequency Spectrum - Blue(Octave), Red(8-Bit Quantized)')

Рисунок 3
Ошибка квантования и спектр ошибок квантования

Рисунок 4
Из рисунка 4 видно, что спектр квантования в красном FAR выключен из нашей первоначальной конструкции. Полоса остановки намного выше -40 дБ, и полоса пропускания имеет некоторые ужасные пульсации. Это связано с тем, что наш шум квантования, показанный на рисунке 3, был добавлен к нашему первоначальному дизайну. Чтобы укротить ответ, нам нужно масштабировать коэффициенты. Масштабирование коэффициентов максимизирует диапазон значений, которые коэффициенты могут принимать в реальной системе обработки, что в свою очередь минимизирует ошибку шума квантования. Мы делаем это следующим образом:
h_scl = max(hc); h_q2 = floor((hc/h_scl)*2^8)/2^8; q2 = h_scl *h_q2 - hc; h_q2 = h_q2/sum(h_q2); figure subplot(211) plot(q1) title('Quantization Error') subplot(212) plot((-0.5:1/4096:0.5-1/4096)*Fs, 20*log10(abs(fftshift(fft(q2, 4096))))) title('Quantization Error Spectrum') figure plot((-0.5:1/4096:0.5-1/4096)*Fs, 20*log10(abs(fftshift(fft(hc, 4096))))) hold on plot((-0.5:1/4096:0.5-1/4096)*Fs, 20*log10(abs(fftshift(fft(h_q2, 4096)))), 'color', 'r') grid on axis((-Fs/2 Fs/2 -140 5)) title('Frequency Spectrum W/ Scaling - Blue(Octave), Red(8-Bit Quantized)')

Рисунок 5
При масштабировании мы видим, что частотный спектр намного лучше, чем на рисунке 4. Наша стоп-группа соответствует нашему внутреннему дизайну ниже -40 дБ, и наша пульсация полосы пропускания уменьшена. По-прежнему существует довольно много ошибок, связанных с этим примером, потому что мы решили реализовать это на 8-разрядном микропроцессоре, но масштабируем его до 16 или выше, и вы обнаружите, что ваш дизайн почти точно соответствует вашим коэффициентам реализации.
В этом учебном пособии показано значение квантования и масштабирования коэффициентов для реализации КИХ-фильтра на реальном оборудовании.