精华内容
下载资源
问答
  • 基于FPGA低通滤波器FIR的设计1 滤波器的特征参数介绍图1 低通滤波器特征参数 如图1所示,低通滤波器的通带截止频率为ωp ,通带容限为α1,阻带截止频率为ωs,阻带容限为α2。通带定义为|ω|≤ωp ,过渡带定义为ωp2 ...

         基于FPGA低通滤波器FIR的设计

    1 滤波器的特征参数介绍

    ef65273ff5bdd463cad30138b73ab86a.png

    图1 低通滤波器特征参数
           如图1所示,低通滤波器的通带截止频率为ωp ,通带容限为α1,阻带截止频率为ωs,阻带容限为α2。通带定义为|ω|≤ωp ,过渡带定义为ωp

    2 设计目标

          要求:使用fir滤波器设计一个滤波器系数为15阶的低通滤波器,通带截止频率为1KHZ,采样频率为44.1khz。

    3 matlab的设计验证

    close all
    clear all
    clc

    %设计一个低通滤波器 采样频率为44.1khz, 截止频率为1khz

    FS = 44100; %HZ
    fc = 1000;
    N = 15;
    Q = 16;

    %以采样频率的一半,对频率进行归一化处理
    wn_lpf=fc*2/FS;
    %采用fir1函数设计FIR滤波器
    b_lpf=fir1(N-1,wn_lpf);

    %滤波系数进行量化
    b_16=round(b_lpf/max(abs(b_lpf))*(2^(Q-1)-1));

    %求滤波器的幅频响应
    m_lpf=20*log(abs(fft(b_lpf)))/log(10);
    b16_lpf=20*log(abs(fft(b_16)))/log(10);
    %设置幅频响应的横从标单位为Hz
    x_f=[0:(FS/length(m_lpf)):FS/2];

    %绘制单位脉冲响应
    subplot(221);stem(b_lpf);xlabel('n');ylabel('h(n)');
    title('低通滤波器的单位脉冲响应','fontsize',8);

    subplot(222);stem(b_16);xlabel('n');ylabel('h(n)');
    title('低通滤波器的单位脉冲响应','fontsize',8);

    %绘制幅频响应曲线
    subplot(223);plot(x_f,m_lpf(1:length(x_f)));xlabel('频率(Hz)','fontsize',8);ylabel('幅度(dB)','fontsize',8);
    title('低通滤波器的幅频响应','fontsize',8);

    subplot(224);plot(x_f,b16_lpf(1:length(x_f)));xlabel('频率(Hz)','fontsize',8);ylabel('幅度(dB)','fontsize',8);
    title('低通滤波器的幅频响应','fontsize',8);

    33516b3e50e9739e21b7fc0aaf18cb1d.png

    图2 低通滤波器的matlab单位脉冲响应和幅频响应

    4 FPGA信号发生器

    为了验证低通滤波器,我们设计了测试验证的sin信号发生器。
    wire [17:0] kfreq= (k<2048)?18’h00333:18’h00FFF;//1khz-5khz
    产生1khz和5khz的sin波。d3d6039b9c0d94f7e19ea3e7a22b550c.png

    图3 信号发生器产生1khz和5khz的sin测试源

    测试源的FFT分析:5d95c88575589ae43af40ae9d06bdd66.png
    图4 测试源数据的matlab分析

          由图4的频域图可知,测试源产生了1khz和5khz的sin。

    5 FPGA的fir设计

          Fir滤波器verilog代码设计采取全并行模式。

    `timescale 1ps/1ps

    module fir1(
    input mclk,//45.1584MHZ
    input reset_n,
    input signed[31:0] pcm_in,
    output signed[31:0] pcm_out
    );

    localparam LAST_CYCLE = 1023;
    reg [9:0] i;

    reg signed [31:0] pcm1,pcm2,pcm3,pcm4,pcm5,pcm6,pcm7,pcm8,pcm9,pcm10,pcm11,pcm12,pcm13,pcm14,pcm15;
    reg signed [47:0] pcm1_out,pcm2_out,pcm3_out,pcm4_out,pcm5_out,pcm6_out,pcm7_out,pcm8_out,pcm9_out,pcm10_out,pcm11_out,pcm12_out,pcm13_out,pcm14_out,pcm15_out;
    reg signed [51:0] pcm_r;

    wire signed [15:0] coeff1,coeff2,coeff3,coeff4,coeff5,coeff6,coeff7,coeff8,coeff9,coeff10,coeff11,coeff12,coeff13,coeff14,coeff15;

    assign coeff1 = 2208;
    assign coeff2 = 3631;
    assign coeff3 = 7612;
    assign coeff4 = 13576;
    assign coeff5 = 20413;
    assign coeff6 = 26727;
    assign coeff7 = 31169;
    assign coeff8 = 32767;
    assign coeff9 = 31169;
    assign coeff10 = 26727;
    assign coeff11 = 20413;
    assign coeff12 = 13576;
    assign coeff13 = 7612;
    assign coeff14 = 3631;
    assign coeff15 = 2208;
    assign pcm_out = pcm_r[51:20];
    always @(posedge mclk or negedge reset_n) begin
    if(!reset_n) begin
    i<= 0;
    pcm1<=0;
    pcm2<=0;
    pcm3<=0;
    pcm4<=0;
    pcm5<=0;
    pcm6<=0;
    pcm7<=0;
    pcm8<=0;
    pcm9<=0;
    pcm10<=0;
    pcm11<=0;
    pcm12<=0;
    pcm13<=0;
    pcm14<=0;
    pcm15<=0;

    pcm1_out<=0;
    pcm2_out<=0;
    pcm3_out<=0;
    pcm4_out<=0;
    pcm5_out<=0;
    pcm6_out<=0;
    pcm7_out<=0;
    pcm8_out<=0;
    pcm9_out<=0;
    pcm10_out<=0;
    pcm11_out<=0;
    pcm12_out<=0;
    pcm13_out<=0;
    pcm14_out<=0;
    pcm15_out<=0;

    pcm_r<= 0;
    end
    else begin
    i <= i + 1;
    if(i == 0) begin
    pcm1<=pcm_in;
    pcm2<=pcm1;
    pcm3<=pcm2;
    pcm4<=pcm3;
    pcm5<=pcm4;
    pcm6<=pcm5;
    pcm7<=pcm6;
    pcm8<=pcm7;
    pcm9<=pcm8;
    pcm10<=pcm9;
    pcm11<=pcm10;
    pcm12<=pcm11;
    pcm13<=pcm12;
    pcm14<=pcm13;
    pcm15<=pcm14;
    end
    if(i==1) begin
    pcm1_out <= pcm1*coeff1;
    pcm2_out <= pcm2*coeff2;
    pcm3_out <= pcm3*coeff3;
    pcm4_out <= pcm4*coeff4;
    pcm5_out <= pcm5*coeff5;
    pcm6_out <= pcm6*coeff6;
    pcm7_out <= pcm7*coeff7;
    pcm8_out <= pcm8*coeff8;
    pcm9_out <= pcm9*coeff9;
    pcm10_out <= pcm10*coeff10;
    pcm11_out <= pcm11*coeff11;
    pcm12_out <= pcm12*coeff12;
    pcm13_out <= pcm13*coeff13;
    pcm14_out <= pcm14*coeff14;
    pcm15_out <= pcm15*coeff15;
    end
    if(i==2) pcm_r<= pcm1_out +pcm2_out+pcm3_out+pcm4_out+pcm5_out+pcm6_out+pcm7_out+pcm8_out+pcm9_out+pcm10_out+pcm11_out+pcm12_out+pcm13_out+pcm14_out+pcm15_out;
    end
    end

    endmodule

         fpga实验modelsim仿真结果,从图5来看1khz几乎保持不变,而5khz波形幅度上被抑制了很多。97e3af59f5dbe62b600560e7bcddb558.png
    图5 modelsim fir实验结果时域波形

    Matlab fft分析:bd408ee191b63deccf5fa5c193752a7d.png

    图6 matlab分析实验结果

          由图2和图6对比,5khz经过滤波后的功率减小了20DB,图2与图5基本一致,fir的低通滤波器全并行设计成功。

    DSP往期

    音频总线I2S协议

    信号的产生

    信号的基本概念

    基于LUTDDS的设计

    更多精彩推荐,请关注我们

    515790fa2c6e2c3417f9f3956b3ce06e.png

    万水千山总是情,点个 “好看” 行不行!!!

    6ad62d789a7908bbd1df93ce45350a36.png   
    展开全文
  • Matlab中自带工具箱FDATool也能很方便快速的实现滤波器系数h的整定,可以方便应用到嵌入式(大多数基于FIR滤波设计)、FPGA、DSP里的FIR系数当中,本文将描述基于MATLAB下FDATool生成FIR的实用方法。FDATool打开,...

    Matlab中自带工具箱FDATool也能很方便快速的实现滤波器系数h的整定,可以方便应用到嵌入式(大多数基于FIR滤波设计)、FPGA、DSP里的FIR系数当中,本文将描述基于MATLAB下FDATool生成FIR的实用方法。

    FDATool打开,可以直接在命令窗口键入fdatool回车即可启动,也可以通过UI界面打开,操作如下:

    aad933de218e4e05cbb5bb62473337f2.png
    UI界面下打开 FDATool

    这里通过图解快速进行一个FIR设计一个低通滤波器,

    1. 滤波类型(Filter Type)= Lowpass

    2. 采样率(Fs) = 1000HZ

    3. 滤波阶数(order) = 16(阶数越大,滤波品质越好,但相对滞后越大)

    4. 密度因子( Density Factor)= order+1 = 17

    5. Fpass(通频带)= 95HZ

    6. Fstop(截止带)= 105HZ

    7. Wpass(通频带宽增益期望)= 1DB

    8. Wstop(截止带宽增益期望)= -40DB

    具体FDA设计图:

    d44e9df0bbe9f87c94fe194abd76303e.png
    FDA设计FIR滤波器

    生成FIR系数,笔者建议,直接生成ASCII复制出来放到需要运行的工程。File→Export然后保存ASCII格式,这时候MATLAB将会自动打开该文件(也可以通过记事本打开)。

    901ff1f8592f3559d645075b64b2a478.png
    FIR系数保存成ACSII格式

    fec31aec7e5941ee7757d2faef630b0c.png
    FIR系数内容,取Numberator部分

    最后,用该系数进行FIR滤波处理,详见代码(强烈建议将FIR的h系数拷贝到工程里面):

    clear all
    clc
    
    %FIR h 1000HZ lopass Fpass = 95HZ  Fstop = 105HZ
    h = [0.013645230215860393307991671463241800666
        0.020864467885159766052938223879209544975
        0.033805656970854927600989014990773284808
        0.048945673554616375700021535521955229342
        0.064942719858356201534377305506495758891
        0.080076064347642750274047784841968677938
        0.092538395154703717571109677919594105333
        0.100751060201654682457750311641575535759
        0.103616541625144178984108123131591128185
        0.100751060201654682457750311641575535759
        0.092538395154703717571109677919594105333
        0.080076064347642750274047784841968677938
        0.064942719858356201534377305506495758891
        0.048945673554616375700021535521955229342
        0.033805656970854927600989014990773284808
        0.020864467885159766052938223879209544975
        0.013645230215860393307991671463241800666];
    
    Fs = 1000;            % Sampling frequency HZ                   
    T = 1/Fs;             % Sampling period  S     
    N = 2000;             % Number of signal 
    t = (0:N-1)*T;        % Time vector
    
    %构造一个信号,其中包含幅值为 0.7 的 50 Hz 正弦量和幅值为 1 的 120 Hz 正弦量
    y1 = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
    %利用h系数进行FIR滤波
    y2 = filter(h',1,y1);
    
    %波形快速傅里叶运算
    Y1 = fft(y1);
    Y2 = fft(y2);
    
    %计算双侧频谱P2
    P1_2 = abs(Y1/N);
    %取出前面一半进行分析
    P1_1 = P1_2(1:N/2+1);
    %最终转化为单侧幅频
    P1_1(2:end-1) = 2*P1_1(2:end-1);
    
    %计算双侧频谱P2
    P2_2 = abs(Y2/N);
    %取出前面一半进行分析
    P2_1 = P2_2(1:N/2+1);
    %最终转化为单侧幅频
    P2_1(2:end-1) = 2*P2_1(2:end-1);
    
    %确定频域映射,转化为HZ
    f = Fs*(0:(N/2))/N;
    
    subplot(4,1,1);
    plot(t,y1);
    title('原始信号0.7幅值50HZ,1幅值120HZ')
    subplot(4,1,2);
    plot(f,P1_1);
    title('原始信号FFT分析')
    subplot(4,1,3);
    plot(t,y2);
    title('FIR滤波后波形')
    subplot(4,1,4);
    plot(f,P2_1);
    title('FIR滤波后FFT')

    7f26d13ad37aae464eb396e27f604bf6.png
    FIR数据滤波后图形演示
    展开全文
  • 实用的程序代码,用于adc采样之后的滤波
  • 匿名用户1级2011-05-20 回答%所希望的频率响应在0~0.25*pi之间为1,...%首先需要理解实际的滤波器是没有办法做到理想状态的。如果你要理想状态的话,%就直接就是矩形窗序列乘序列就OK, 矩形窗只能达到20.9dB 的衰减...

    匿名用户

    1级

    2011-05-20 回答

    %所希望的频率响应在0~0.25*pi之间为1,在0.25*pi~pi之间为0,对h(n)加窗截断,

    %选择矩形窗和任意一种其他窗口,每种窗口长度分别为M=10、20、40三种情况,

    %对每种情况要进行性能好坏的分析。

    %首先需要理解实际的滤波器是没有办法做到理想状态的。如果你要理想状态的话,

    %就直接就是矩形窗序列乘序列就OK, 矩形窗只能达到20.9dB 的衰减

    %但是实际的加窗构成的滤波器,必然会存在波纹,和过渡带 滤波器的衰减指标主要

    %是由阻带衰减确定的 不妨设 阻带衰减为 50dB 那么要达到这个指标,通过查表,

    %可以知道-必须是hamming window(54.5dB) 或 blackman window(75.3dB)

    %下面是加窗的低通FIR滤波器

    clear

    clc;

    wc=0.25*pi;

    wdelta=wc-2*wc/3; %设定过渡带宽度

    M=ceil(3.32*pi/wdelta) ; %窗口长度 这里计算合理的窗长

    N1=2*M+1;

    winlp=hamming(N1);

    Flp=fir1(N1-1,wc/pi,winlp);

    freqz(Flp,1,512);

    title('Frequency & Phase Response ');

    % 下面就是按你的要求啦,窗长M=10、20、40

    M=[10,20,40];

    N=2*M+1;

    % M=10

    figure(2);

    Win0=hamming(N(1));

    FLP0=fir1(N(1)-1,wc/pi,Win0);

    freqz(FLP0,1,512);

    title('Frequency & Phase Response M=10');

    % M=20

    figure(3);

    Win1=hamming(N(2));

    FLP1=fir1(N(2)-1,wc/pi,Win1);

    freqz(FLP1,1,512);

    title('Frequency & Phase Response M=20');

    % M=30

    figure(4);

    Win2=hamming(N(3));

    FLP2=fir1(N(3)-1,wc/pi,Win2);

    freqz(FLP2,1,512);

    title('Frequency & Phase Response M=30');

    % 至于矩形窗 设 20dB衰减

    figure(5)

    M0=ceil(0.92*pi/wdelta) ; %窗口长度 这里计算合理的窗长

    N0=2*M0+1;

    ww=boxcar(N0);

    fflp=fir1(N0-1,wc/pi,ww);

    freqz(fflp,1,512);

    title('Frequency & Phase Response Rectangular');

    展开全文
  • matlab 一个简单的FIR低通滤波器设计例子 先直接放代码跟结果 %假设有一个3hz的信号,由于某种原因带有一些高频噪声,需要将其滤除掉 close all; clear all; load lowpass_fir; %fs=20 fc=6的32阶低通滤波器汉明窗 ...

    matlab 一个简单的FIR低通滤波器设计例子

    先直接放代码跟结果

    %假设有一个3hz的信号,由于某种原因带有一些高频噪声,需要将其滤除掉
    close all;
    clear all;
    load lowpass_fir; %fs=20 fc=6的32阶低通滤波器汉明窗
    
    fs = 20;  %采样率
    T0 = 10;  %信号时长10s
    F0 = 1/T0; %频率分辨率
    N = fs*T0; %采样点数
    t = (0:N-1)/fs;  %时间轴坐标
    f = (0:F0:fs/2-F0);  %频率轴坐标
    
    x = sin(2*pi*3*t)+1.2*sin(2*pi*7*t)+0.7*sin(2*pi*8*t)+0.2*randn(size(t));  %模拟信号
    subplot(2,2,1);
    plot(t(1:100),x(1:100));
    
    fx = abs(fft(x))*(2/N); %2/N中的N很好理解,2是因为matlab的FFT把负频也算上了,只分析正频需要加倍
    subplot(2,2,3);
    plot(f,fx(1:N/2));
    
    y = filter(b_fir,1,x);
    subplot(2,2,2);
    plot(t(1:100),y(1:100));
    
    fy = abs(fft(y))*(2/N);
    subplot(2,2,4);
    plot(f,fy(1:N/2));
    

    在这里插入图片描述

    1.输出有延迟,FIR滤波器的特性,阶数越大延迟越高,延迟为(N-1)/2,

    2.窗函数法不可避免带来一定的频谱泄露,所以输出在3hz幅度变小,附近的频率分量增大

    要有基本的数信理论才能看懂,最重要的是两点性质

    1.观测时长为T0,则频率分辨率为F0=1/T0

    2.采样频率为fs,则最大观测频率为fs

    这样才能将坐标系对应上

    matlab的滤波器设计如下,需要将滤波器系数导出这样方便使用,有了系数就可以用C语言去实现了。对于入门来说,用什么窗,阶数是多少就随便了
    在这里插入图片描述

    展开全文
  • 按照所通过信号频率的不同分为:低通滤波器-允许信号中的低频或直流分量通过,抑制高频分量或干扰和噪声;高通滤波器-允许信号中的高频分量通过,抑制低频或直流分量;带通滤波器-允许一定频段的信号通过,抑制低于...
  • clearclose allglobal FsFs = 360;load '118m.mat'%mit数据库第118条数据signal = ...%% 采用FIR I型设计20Hz以下的低通滤波器fp=14; fs=18;detap = 0.01;detas = 0.01;[M,beta] = selectFirFilterN(fp,fs,detap,d...
  • 本文使用的开发环境为:Win10 Matlab... 按照下图调整FIR低通滤波器的参数:我们设计的是采样频率100Hz,截止频率10Hz的8阶FIR低通数字滤波器。 生成matlab函数代码:File—Generate MATLAB Code—Filter Design F...
  • 三、用频率抽样法设计一个理想低通滤波器,该低通滤波器的通带截止频率为3л/8,阻带截止频率为4л/8。 1)不加过渡点。 2)加一个过渡点。 3)加两个过渡点。 要求:掌握并了解在过渡带加过渡点对逼近滤波器的实际...
  • MATLAB的FDATool设计一个FIR低通滤波器,Fs=4HZ,Fc=1.5HZ,Order=16,输入采样32个值恒定=1.那么滤波器输出是不是应该=1 ? 我用STM32的CMSIS库函数arm_fir_f32(&S, inputF32 + (i * blockSize), outputF32 + ...
  • 一、Matlab实现hamming,hanning时域窗函数相乘法。数字滤波器都是2π归一化的,2π对应fs采样率。...% %------------------------------低通滤波器2----------------------------------fpass=200; ...
  • %设计FIR数字低通滤波器,截止频率为pi/4,在不同窗口长度(N=15,N=33)下,分别求出 %h(n),通过幅频特性和相频特性,观察3dB带宽和20dB带宽,总结窗口长度N对滤波特性的影响。 close all; clc; clear; N=15; N1=N...
  • matlab代码仿真设计的导通低通带通带阻四种fir数字滤波器,亲测可用,并且做了非常详细的代码说明,
  • %设计FIR数字低通滤波器,截止频率为pi/4,在不同窗口长度(N=15,N=33)下,分别求出 %h(n),通过幅频特性和相频特性,观察3dB带宽和20dB带宽,总结窗口长度N对滤波特性的影响。 close all; clc; clear; N=15; N1=N...
  • 2.1 IIR滤波器FIR滤波器的分析比较 2.2 FIR滤波器的原理 3 FIR滤波器的仿真步骤 ## `二、源代码` ```c function varargout = nain1(varargin) % NAIN1 MATLAB code for nain1.fig % ..
  • 2.1 IIR滤波器FIR滤波器的分析比较 2.2 FIR滤波器的原理 3 FIR滤波器的仿真步骤 二、源代码 function varargout = nain1(varargin) % NAIN1 MATLAB code for nain1.fig % NAIN1, by itself, creates a ...
  • 2.1 IIR滤波器FIR滤波器的分析比较 2.2 FIR滤波器的原理 3 FIR滤波器的仿真步骤 二、源代码 function varargout = nain1(varargin) % NAIN1 MATLAB code for nain1.fig % NAIN1, by itself, creates a new ...
  • 2.1 IIR滤波器FIR滤波器的分析比较 2.2 FIR滤波器的原理 3 FIR滤波器的仿真步骤 二、源代码 function varargout = nain1(varargin) % NAIN1 MATLAB code for nain1.fig % NAIN1, by itself, creates a ...
  • MATLAB设计低通带通高通和带阻FIR数字滤波器.抽样频率为f 为1KHZ的数字带通滤波器,性能要求为:通带范围从200HZ到250HZ,在此两频率处衰减不大于3dB,在100HZ和400HZ频率处频率衰减不得小于20dB,采用巴特沃斯...
  • 本文档为纯代码。在MATLAB中,设计IIR和FIR滤波器分别对一定频率的音频信号进行滤波,滤除高频噪声,程序中所加载的噪声是利用正弦函数生成的高频噪声,滤波器为低通滤波器
  • 基于C#的窗函数法低通FIR滤波器

    千次阅读 2019-06-16 13:06:49
    基于Visual Studio 2015 开发环境,使用C#编程语言,运用窗函数法构造了FIR低通滤波器。并通过MATLAB对其滤波效果进行了试验。 由于凯泽窗的数学模型过于复杂,笔者能力有限,故无法在本文中给出凯泽窗的窗函数代码...
  • 采用窗函数法设计理想低通,...1) 确定滤波器类型,不同的FIR类型可设计不同类型的滤波器,I型可设计LP(低通滤波器),HP(高通滤波器),BP(带通滤波器),BS(带阻滤波器)。 Fir I型 Fir II型 ...
  • 汉明窗的FIR低通滤波:Fs=22050;[x,FS,bits]=wavread('G:\Users\DP\Desktop\SoundTest.wav');%G:\Users\DP\Desktop \SoundTest.wav G:\Users\DP\Desktop\好铃网-湖人掘金宣传片.wavx=x(:,1);figure(1);subplot(2,1,1...
  • (本人 小论文 代码,通过验证) 本文提出一种新的FIR滤波器FPGA实现方法。讨论了分布式算法原理,并...因此本文采用分布式算法设计一个可配置的FIR滤波器,并以31阶的低通FIR滤波器为例说明分布式算法滤波器结构。
  • 文件是用matlab设计的fir数字滤波器,包括带通、带阻、低通、高通、低通加带阻五种滤波器代码都是自己编写并且验证通过,代码中有非常详尽的说明,每行代码基本都有注释,对于学习用matlab设计fir数字滤波器有很大...
  • 了解有限长单位冲激响应FIR数字滤波器的传统设计方法,...利用MATLAB编程设计一个10阶的低通FIR数字滤波器,通带截止频率4KHZ,阻带起始频率6KHZ,采样频率40KHZ的数字低通滤波器,带外衰减不低于-60dB。通带衰减1dB。

空空如也

空空如也

1 2 3
收藏数 60
精华内容 24
关键字:

fir低通滤波器matlab代码

matlab 订阅