0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

串行FIR濾波器MATLAB與FPGA實(shí)現(xiàn)

CHANBAEK ? 來源:FPGA and ICer ? 作者:Vuko ? 2023-05-24 10:56 ? 次閱讀

前言

本文介紹了設(shè)計(jì)濾波器FPGA實(shí)現(xiàn)步驟,并結(jié)合杜勇老師的書籍中的串行FIR濾波器部分進(jìn)行一步步實(shí)現(xiàn)硬件設(shè)計(jì),對(duì)書中的架構(gòu)做了簡單的優(yōu)化,并進(jìn)行了仿真驗(yàn)證。

FIR濾波器的FPGA實(shí)現(xiàn)步驟

從工程角度分析FIR濾波器的FPGA實(shí)現(xiàn)步驟如下:

  1. 分析設(shè)計(jì)需求,根據(jù)設(shè)計(jì)需求確定FIR濾波器的仿真算法設(shè)計(jì)。
  2. 編寫仿真代碼或利用工具生成相關(guān)設(shè)計(jì)文件(包括但不局限與c++、MATLABpython等語言或者相關(guān)濾波器設(shè)計(jì)工具)
  3. 量化濾波器系數(shù),防止運(yùn)算時(shí)數(shù)據(jù)溢出造成錯(cuò)誤。
  4. 根據(jù)實(shí)際工程需求確定硬件實(shí)現(xiàn)架構(gòu)并編寫代碼。

量化濾波器系數(shù)的影響

量化位數(shù)對(duì)濾波器的阻帶紋波有較大的影響,且量化位數(shù)越高,則影響越小。下面給出兩個(gè)之前設(shè)計(jì)的FIR IP工程中量化效果的截圖,從圖中可以很清楚看出,當(dāng)量化位數(shù)不夠,也就是量化精度不夠時(shí),對(duì)阻帶影響較大,使用量化效果不好的濾波器可能造成濾波效果不能達(dá)到預(yù)期效果。

圖片
量化精度不夠

圖片
正常量化

串行FIR濾波器FPGA實(shí)現(xiàn)

FIR濾波器的結(jié)構(gòu)形式時(shí),介紹了直接型、級(jí)聯(lián)型、頻率取樣型和快速卷積型4種。在FPGA實(shí)現(xiàn)時(shí),最常用的是最簡單的直接型結(jié)構(gòu)。FPGA實(shí)現(xiàn)直接型結(jié)構(gòu)的FIR濾波器,可以采用串行結(jié)構(gòu)、并行結(jié)構(gòu)等不同中的結(jié)構(gòu)設(shè)計(jì),本節(jié)主要介紹在vivado環(huán)境下進(jìn)行串行FIR濾波器設(shè)計(jì)的結(jié)構(gòu)實(shí)現(xiàn),同樣仿造杜勇老師的《數(shù)字濾波器的MATLAB與FPGA實(shí)現(xiàn)》的書中的設(shè)計(jì)需求去一步步搭建工程并實(shí)現(xiàn)。

實(shí)現(xiàn)串行FIR濾波器濾波器需求

設(shè)計(jì)一個(gè)15階(長度為16)的低通線性相位FIR濾波器,采用窗函數(shù)設(shè)計(jì),截止頻率為500 Hz,采樣頻率為2 000 Hz;采用FPGA實(shí)現(xiàn)全串行結(jié)構(gòu)的濾波器,系數(shù)的量化位數(shù)為12比特,輸入數(shù)據(jù)位寬為12比特,輸出數(shù)據(jù)位寬為29比特,系統(tǒng)時(shí)鐘為16 kHz。

濾波器系數(shù)確定與量化

確定濾波器的結(jié)構(gòu)后,就根據(jù)濾波器進(jìn)行設(shè)計(jì)代碼仿真,這里引用書中的仿真設(shè)計(jì),并將濾波器參數(shù)系數(shù)量化。 確定濾波器系數(shù)的方法有很多,可以使用MATLAB中豐富的函數(shù)實(shí)現(xiàn),或者使用相關(guān)濾波器設(shè)計(jì)的軟件工具,定制滿足當(dāng)前需求的窗函數(shù)的濾波器系數(shù)。

N=16;      %濾波器長度
fs=2000;   %采樣頻率
fc=500;    %低通濾波器的截止頻率
B=12;      %量化位數(shù)
%生成各種窗函數(shù)
w_kais=blackman(N)';
%采用fir1函數(shù)設(shè)計(jì)FIR濾波器
b_kais=fir1(N-1,fc*2/fs,w_kais);
%量化濾波器系數(shù)
Q_kais=round(b_kais/max(abs(b_kais))*(2^(B-1)-1))
hn=Q_kais;
%轉(zhuǎn)化成16進(jìn)制數(shù)補(bǔ)碼
Q_h=dec2hex(Q_kais+2^B*(Q_kais<0))
%求濾波器的幅頻響應(yīng)
m_kais=20*log(abs(fft(b_kais,1024)))/log(10); m_kais=m_kais-max(m_kais);
Q_kais=20*log(abs(fft(Q_kais,1024)))/log(10); Q_kais=Q_kais-max(Q_kais);
%設(shè)置幅頻響應(yīng)的橫坐標(biāo)單位為Hz
x_f=[0:(fs/length(m_kais)):fs/2];
%只顯示正頻率部分的幅頻響應(yīng)
m5=m_kais(1:length(x_f));
m6=Q_kais(1:length(x_f));
%繪制幅頻響應(yīng)曲線
plot(x_f,m5,'-',x_f,m6,'--');
xlabel('頻率(Hz)');ylabel('幅度(dB)');
legend('未量化','12bit量化');
grid;

硬件架構(gòu)

下圖為杜勇老師的《數(shù)字濾波器的MATLAB與FPGA實(shí)現(xiàn)》實(shí)現(xiàn)的串行FIR濾波器的結(jié)構(gòu)圖。 因?yàn)镕IR濾波器參數(shù)對(duì)稱,所以同時(shí)計(jì)算相應(yīng)的對(duì)稱結(jié)構(gòu)的值,所以針對(duì)長度為16的濾波器只需要計(jì)算8次即可出結(jié)果,圖中的8個(gè)時(shí)鐘周期可以替換成N/2;這樣就得到了一個(gè)通用化的串行FIR濾波器結(jié)構(gòu)圖。

圖片
串行FIR濾波器結(jié)構(gòu)

串行實(shí)現(xiàn)FIR濾波器,可以節(jié)約加法器資源,同時(shí)犧牲了整個(gè)濾波器實(shí)現(xiàn)的性能,缺點(diǎn)也就很明顯了,當(dāng)濾波器的系數(shù)長度N增大時(shí),該數(shù)據(jù)吞吐的速率也將對(duì)應(yīng)變成1/N。

根據(jù)架構(gòu)描述電路

杜勇老師書中提供的代碼相當(dāng)繁瑣,而且不具有通用化的使用價(jià)值(串行FIR使用價(jià)值確實(shí)不大,可能只用于學(xué)習(xí)),我根據(jù)上述的硬件設(shè)計(jì)的架構(gòu)對(duì)代碼進(jìn)行了重寫配置,使得代碼更具有通用意義,可根據(jù)參數(shù)輸入來適配不同濾波器長度的設(shè)計(jì)。

圖片
實(shí)現(xiàn)模塊框圖

接口描述如下:

圖片
接口描述

參數(shù)描述如下:

圖片
參數(shù)描述

代碼如下:

`timescale 1ns / 1ps
module Fir_FullSerial(

        input clk,//!系統(tǒng)時(shí)鐘
        input rst,//!復(fù)位信號(hào)
        input signed [SIGN_IN_WIDTH-1:0] signal_in,//!信號(hào)輸入
        output signed [SIGN_OUT_WIDTH-1:0] signal_out//!信號(hào)輸出,信號(hào)輸出速度為CLK/FIR_COE_NUM
    );

    //
    parameter  integer SIGN_IN_WIDTH    = 12   ;//!信號(hào)輸入位寬
    parameter  integer SIGN_OUT_WIDTH = 29   ;//!信號(hào)輸出位寬
    parameter  integer FIR_COE_WIDTH = 12   ;//!濾波器系數(shù)位寬
    parameter  integer FIR_COE_NUM = 16   ;//!濾波器長度
    localparam integer FIR_WIDTH_DIV_2 = FIR_COE_NUM/2 ;

    function [FIR_COE_WIDTH-1:0] coe_data;
    input [FIR_WIDTH_DIV_2-1:0] index;
    begin
        case(index)
        'd0:coe_data='h000;
        'd1:coe_data='hffd;
        'd2:coe_data='h00f;
        'd3:coe_data='h02e;
        'd4:coe_data='hf8b;
        'd5:coe_data='hef9;
        'd6:coe_data='h24e;
        'd7:coe_data='h7ff;
        endcase
    end
    endfunction
    
    //!寄存輸入信號(hào)
    reg [SIGN_IN_WIDTH-1:0] Sign_in_Reg[FIR_COE_NUM-1:0];

    //!計(jì)數(shù)器邏輯
    reg [FIR_WIDTH_DIV_2-1:0] cnt;
    always @(posedge clk ) begin
        if (rst=='b1) begin
            cnt<='d0;
        end
        else begin
            if (cnt==FIR_WIDTH_DIV_2-'b1) begin
                cnt <= 0;
            end
            else begin
                cnt <= cnt + 1;
            end
        end
    end

    //將數(shù)據(jù)存入移位寄存器sign_in_Reg中
    integer i;
    always @(posedge clk)begin
        if (rst=='b1)begin
            //初始化寄存器值為0
            for (i=0; i

其中,代碼增加了一個(gè)信號(hào)輸出標(biāo)志,該標(biāo)志信號(hào)為傳輸8次數(shù)據(jù)后延時(shí)三拍的數(shù)據(jù),為什么是三拍? 因?yàn)樽x取信號(hào)后首先做了一級(jí)位寬拓展,第二級(jí)做了乘加運(yùn)算,第三級(jí)為累加輸出。 所以輸出信號(hào)相比傳輸數(shù)據(jù)完成的位置延遲三拍。

針對(duì)乘累加運(yùn)算,這里沒有使用IP,但是為了加速信號(hào)傳輸該信號(hào)的運(yùn)算使用dsp48,所以在信號(hào)聲明時(shí)前面加了(*use_dsp48="yes"*)。

仿真數(shù)據(jù)設(shè)計(jì)

為了驗(yàn)證串行設(shè)計(jì)代碼的正確性。 這里使用MATLAB腳本產(chǎn)生了一個(gè)混頻信號(hào),然后將混頻信號(hào)進(jìn)行量化處理并導(dǎo)出txt文件以供仿真文件讀取。

clc;close all;clear all;
 Fs = 2000; %采樣頻率
N = 2^10; %采樣點(diǎn)數(shù)
f1=300; %正弦波1頻率
f2=400; %正弦波1頻率
t=[0:N-1]/Fs; %時(shí)間序列
s1 = sin(2*pi*f1*t) ;
s2 = sin(2*pi*f2*t) ;
s = s1 .* s2;
figure(1);
subplot(1,2,1);
plot(t,s,'r','LineWidth',1.2);
title('時(shí)域波形');
axis([0,100/Fs,-3,3]);
set(gca,'LineWidth',1.2);
%轉(zhuǎn)化為位寬12bit數(shù)據(jù)
s_12bit=s./max(s).*(2.^11 - 1); % DA輸入波形,量化到16bit
s_12bit(find(s_12bit<0) ) = s_12bit(find(s_12bit<0) ) + 2^12 - 1;
s_12bit = fix(s_12bit);
s_12bit = dec2hex(s_12bit);
% %生成文件
fid= fopen('sin_data.txt','w+');
%生成十六進(jìn)制
for i=1:N
    fprintf(fid,'%s',s_12bit(i,:));
    fprintf(fid,'\\r\\n');
end
fclose(fid);

%% 設(shè)計(jì)驗(yàn)證
N=16;      %濾波器長度
fs=2000;   %采樣頻率
fc=500;    %低通濾波器的截止頻率
B=12;      %量化位數(shù)
%生成各種窗函數(shù)
w_kais=blackman(N)';
%采用fir1函數(shù)設(shè)計(jì)FIR濾波器
b_kais=fir1(N-1,fc*2/fs,w_kais);
ss=conv(b_kais,s);
subplot(1,2,2);
plot(t(20:1000),ss(20:1000));
title('濾波后信號(hào)');
axis([0,100/Fs,-1,1]);
set(gca,'LineWidth',1.2);

運(yùn)行仿真后,根據(jù)設(shè)計(jì)的濾波器系數(shù)進(jìn)行仿真,發(fā)現(xiàn)可以正常濾波除去高頻分量。

圖片
濾波仿真效果

仿真激勵(lì)文件編寫

`timescale 1ns / 1ps
module Fir_FullSerial_tb;

    // Parameters
    localparam integer SIGN_IN_WIDTH = 12;
    localparam integer SIGN_OUT_WIDTH = 29;
    localparam integer FIR_COE_WIDTH = 12;
    localparam integer FIR_COE_NUM = 16;

    // Ports
    reg clk = 1;
    reg rst = 1;
    reg [SIGN_IN_WIDTH-1:0] signal_in;
    wire [SIGN_OUT_WIDTH-1:0] signal_out;

    Fir_FullSerial #(
                       .SIGN_IN_WIDTH(SIGN_IN_WIDTH ),
                       .SIGN_OUT_WIDTH(SIGN_OUT_WIDTH ),
                       .FIR_COE_WIDTH(FIR_COE_WIDTH ),
                       .FIR_COE_NUM (FIR_COE_NUM )
                   )Fir_FullSerial_dut (
                       .clk (clk ),
                       .rst (rst ),
                       .signal_in (signal_in ),
                       .signal_out  ( signal_out)
                   );

    reg  [11:0] mem [0:99];
    reg  [9:0] addr ;
    reg  [11:0]data_out ;
    always #(10*8)
    begin
        if(rst==0)
            addr = addr + 10'd1;
        signal_in  =  mem[addr][11:0];
    end

    always
        #5  clk = ! clk ;

    initial
    begin
        signal_in =0;
        $readmemh("sin_data.txt",mem);
        addr  = 10'd0;
        #10;
        rst   = 0;
       
    end
endmodule

運(yùn)行仿真,查看波形可見,濾波效果和仿真結(jié)果一致。

圖片
仿真波形

關(guān)于之前提到的延遲三拍的問題可以在波形輸出這里查看,7ff為濾波器系數(shù)上次運(yùn)算的最后一個(gè)數(shù)據(jù),此數(shù)據(jù)運(yùn)算結(jié)果在下一拍,乘加運(yùn)算的結(jié)果為0,下一拍進(jìn)行累加輸出給sign_out輸出。

圖片
延遲分析

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1629

    文章

    21736

    瀏覽量

    603419
  • matlab
    +關(guān)注

    關(guān)注

    185

    文章

    2976

    瀏覽量

    230483
  • 濾波器
    +關(guān)注

    關(guān)注

    161

    文章

    7817

    瀏覽量

    178132
  • FIR
    FIR
    +關(guān)注

    關(guān)注

    4

    文章

    146

    瀏覽量

    33174
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4797

    瀏覽量

    84690
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于FPGAFIR濾波器設(shè)計(jì)與實(shí)現(xiàn)

    本帖最后由 eehome 于 2013-1-5 09:50 編輯 基于FPGAFIR濾波器設(shè)計(jì)與實(shí)現(xiàn)   文章研究基于FPGA、采用
    發(fā)表于 08-11 15:32

    并行FIR濾波器Verilog設(shè)計(jì)

    寬的運(yùn)算步進(jìn)浪費(fèi)資源而且也沒有必要。在MATLAB中將濾波器系數(shù)量化為指定位寬,會(huì)改變濾波器的頻率特性,因此需要做好仿真,確定量化后的系數(shù)也能滿足FIR的設(shè)計(jì)需求。由上節(jié)可知
    發(fā)表于 09-25 17:44

    高效FIR濾波器的設(shè)計(jì)與仿真-基于FPGA

    高效FIR濾波器的設(shè)計(jì)與仿真-基于FPGA 摘要:該文在介紹有限沖激響應(yīng)(FIR)數(shù)字濾波器理論及常見
    發(fā)表于 01-16 09:56 ?1664次閱讀
    高效<b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>的設(shè)計(jì)與仿真-基于<b class='flag-5'>FPGA</b>

    MATLAB設(shè)計(jì)FIR濾波器的方法

    MATLAB設(shè)計(jì)FIR濾波器的方法 摘? 要 介紹了利用MATLAB信號(hào)處理工具箱進(jìn)行FIR濾波器
    發(fā)表于 01-16 18:12 ?1.5w次閱讀
    用<b class='flag-5'>MATLAB</b>設(shè)計(jì)<b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>的方法

    如何用用FPGA實(shí)現(xiàn)FIR濾波器

    如何用用FPGA實(shí)現(xiàn)FIR濾波器 你接到要求用FPGA實(shí)現(xiàn)
    發(fā)表于 03-30 12:25 ?4674次閱讀
    如何用用<b class='flag-5'>FPGA</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>

    FIR帶通濾波器FPGA實(shí)現(xiàn)

    FIR帶通濾波器FPGA實(shí)現(xiàn) 引 言??? 在FPGA應(yīng)用中,比較廣泛而基礎(chǔ)的就是數(shù)字濾波器
    發(fā)表于 11-13 09:55 ?7060次閱讀
    <b class='flag-5'>FIR</b>帶通<b class='flag-5'>濾波器</b>的<b class='flag-5'>FPGA</b><b class='flag-5'>實(shí)現(xiàn)</b>

    基于MATLABFPGAFIR低通濾波器的設(shè)計(jì)

    充分利用有限沖擊響應(yīng)數(shù)字濾波器(Finite Impulse Response digital filter ,FIR)系數(shù)的對(duì)稱特性,借助于MATLAB語言和現(xiàn)場(chǎng)可編程門陣列(FPGA
    發(fā)表于 08-05 14:23 ?82次下載
    基于<b class='flag-5'>MATLAB</b>及<b class='flag-5'>FPGA</b>的<b class='flag-5'>FIR</b>低通<b class='flag-5'>濾波器</b>的設(shè)計(jì)

    基于MatlabFIR帶通濾波器設(shè)計(jì)與實(shí)現(xiàn)

    本文通過介紹一種借助Matlab的FDATOOL濾波器設(shè)計(jì)分析軟件,設(shè)計(jì)了一種FIR數(shù)字帶通濾波器,并對(duì)一段含噪語音信號(hào)進(jìn)行濾波。利用匯編語
    發(fā)表于 07-26 10:45 ?2.9w次閱讀
    基于<b class='flag-5'>Matlab</b>的<b class='flag-5'>FIR</b>帶通<b class='flag-5'>濾波器</b>設(shè)計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>

    基于MATLABFPGAFIR濾波器設(shè)計(jì)與仿真

    數(shù)字濾波器是數(shù)字信號(hào)處理領(lǐng)域內(nèi)的重要組成部分。FIR濾波器又以其嚴(yán)格的線性相位及穩(wěn)定性高等特性被廣泛應(yīng)用。本文結(jié)合MATLAB工具軟件介紹了FIR
    發(fā)表于 09-25 11:34 ?120次下載
    基于<b class='flag-5'>MATLAB</b>與<b class='flag-5'>FPGA</b>的<b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>設(shè)計(jì)與仿真

    基于Matlab/Simulink的FIR數(shù)字濾波器的設(shè)計(jì)與實(shí)現(xiàn)

    基于Matlab/Simulink的FIR數(shù)字濾波器的設(shè)計(jì)與實(shí)現(xiàn)。
    發(fā)表于 01-15 15:16 ?39次下載

    基于matlabfpgaFIR濾波器設(shè)計(jì)

    基于matlabfpgaFIR濾波器設(shè)計(jì),有興趣的同學(xué)可以下載學(xué)習(xí)
    發(fā)表于 04-27 15:51 ?58次下載

    基于FPGAFIR濾波器設(shè)計(jì)與實(shí)現(xiàn)

    基于FPGAFIR濾波器設(shè)計(jì)與實(shí)現(xiàn),下來看看
    發(fā)表于 05-10 11:49 ?39次下載

    基于MATLABFIR濾波器設(shè)計(jì)與濾波

    基于MATLABFIR濾波器設(shè)計(jì)與濾波。
    發(fā)表于 12-14 22:08 ?64次下載

    FIR濾波器FPGA設(shè)計(jì)與實(shí)現(xiàn)

    ,結(jié)合MATLAB軟件提供的專用數(shù)字濾波器設(shè)計(jì)工具包FDATOOL,以及QuartusⅡ軟件提供的FIR實(shí)現(xiàn)快速、便捷的設(shè)計(jì)FIR
    發(fā)表于 12-21 14:53 ?14次下載
    <b class='flag-5'>FIR</b><b class='flag-5'>濾波器</b>的<b class='flag-5'>FPGA</b>設(shè)計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>

    FIR濾波器MATLABFPGA設(shè)計(jì)

    數(shù)字濾波器實(shí)現(xiàn)結(jié)構(gòu)上劃分,有FIR和IIR兩種。FIR的特點(diǎn)是:線性相位、消耗資源多;IIR的特點(diǎn)是:非線性相位、消耗資源少。由于FIR
    的頭像 發(fā)表于 04-24 14:40 ?3378次閱讀