【技术专辑】实用FIR滤波器设计:第2部分 – 实现滤波器

在第1部分中,我们专注于在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'来看看滤波器的脉冲响应:

 

【技术专辑】实用FIR滤波器设计:第2部分 - 实现滤波器

图1

 

假设有一些DSP的先验知识,请回想一下,在处理FIR时,它具有下面图2的拓扑结构。 脉冲响应只是滤波器的系数。 想象一下,将一次采样持续时间的信号传递给x [n],其幅度为1。 输出只是触摸每个抽头(图2中的bn)的脉冲,产生上面的图1。 

 

【技术专辑】实用FIR滤波器设计:第2部分 - 实现滤波器

 

图2

 

在:

 

【技术专辑】实用FIR滤波器设计:第2部分 - 实现滤波器

 

从图2中我们可以了解FIR滤波器在软件和硬件中的外观。我们需要将系数存储在微处理器中并通过这些抽头传递输入并添加它们以产生我们的输出。在硬件中实现系数的一个重要步骤是量化和缩放。当我们在Octave中计算系数时,我们以高精度计算它们,这是用于设计它们的计算机(32-64位)的结果。当我们为某些N位处理器量化它们以在某些硬件上实现它们时,我们会得到舍入误差。这些舍入误差可能会影响数字滤波器的时间和频率响应,使它们偏离理想值。

 

对于最引人注目的例子,假设我们想在8位定点微处理器上实现这种设计。我们需要量化我们的系数。让我们先完成扩展。要量化系数,请计算以下内容:

 

【技术专辑】实用FIR滤波器设计:第2部分 - 实现滤波器

 

这将为我们提供8位量化系数,我们可以存储在浮点变量类型中。

 

添加以下代码以计算量化系数,量化误差,量化误差频谱,以及在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)')

                  

【技术专辑】实用FIR滤波器设计:第2部分 - 实现滤波器

图3

 

量化误差和量化误差谱

 

【技术专辑】实用FIR滤波器设计:第2部分 - 实现滤波器

图4

 

从图4中可以很容易地看出,红色的量化频谱与我们的初始设计相差很远。阻带远高于-40dB,通带有一些可怕的纹波。这是因为我们的初始设计中添加了图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)')

 

【技术专辑】实用FIR滤波器设计:第2部分 - 实现滤波器

图5

 

通过缩放,我们看到频谱的表现比图4更好。我们的阻带与我们的初始设计相匹配,低于-40dB,并且我们的通带纹波已经降低。此示例仍然存在相当多的错误,因为我们选择在8位微处理器上实现此错误,但是将其扩展到16或更高,您会发现您的设计几乎完全匹配您的实现系数。

 

本教程展示了量化和系数缩放在实际硬件上实现FIR滤波器的重要性。

  • 【技术专辑】实用FIR滤波器设计:第2部分 – 实现滤波器已关闭评论
    A+
发布日期:2019年03月04日  所属分类:参考设计