数字滤波算法(一)

您所在的位置:网站首页 fpga数字滤波后波形不稳定怎么办 数字滤波算法(一)

数字滤波算法(一)

#数字滤波算法(一)| 来源: 网络整理| 查看: 265

一、数字滤波器简介

数字滤波器是指通过一定的数据逻辑构成的可以滤除输入信号中的特定的噪声的算法,这里所指的数字滤波器主要包括平均值滤波、FIR滤波、CIC滤波等,在之后的实验中,我们将介绍不同数字滤波器的原理,通过MATLAB和FPGA分别实现不同数字滤波器,为之后工程中的应用打下基础。

二、滑动平均滤波

2.1 滑动平均滤波原理

若输入采样点的个数为N个,假设采用8倍的滑动平均滤波,其滑动平均滤波的原理如下:

滤波器输出的第一个数据在8个采样周期之后,即首先对输入的8个数据进行平均,平均结果为x_0=(x0+x1+…+x7)/88个周期之后即可以实现数据的滑动输入,并且滤波器输出为x_i=((7*x_i-1)+xi+7)/8 , i=1,2……

2.2 MATLAB实现

%%N倍滑动滤波算法 clear; clc; %数据输入 fileID = fopen('gnd_ch3.txt'); data = textscan(fileID,'%s'); data = data{1,1}; k = 1; for i = 1 : length(data)-11 if strcmp(data(i),'61') && strcmp(data(i+1),'64') Ain(k) = (((hex2dec(strcat(data(i+5),data(i+6),data(i+7)))*20/2^24)-10)*1e6)/50; k = k + 1; end end %变量定义 N = 8;%滑动滤波倍数 M = length(Ain);%输入数据个数 INIT_NUM = 0;%初始数据和 INIT_AVE = 0;%初始数据均值 NUM = 0;%数据和 AVE = 0;%数据均值 Aout = zeros(1,M);%数据输出 %初始均值 %求初始和 for i = 1:1:N-1 INIT_NUM = INIT_NUM + Ain(1,i); end %求初始均值 INIT_AVE = INIT_NUM / N; Aout(1,N) = INIT_AVE; AVE = INIT_AVE; %滑动均值 for i = 1:1:M-N NUM = (AVE * (N-1)) + Ain(1,i + N); AVE = NUM / N; Aout(1,i + N) = AVE; end figure plot(Ain(N+100:M)); hold on; plot(Aout(N+100:M));

绘图结果:

8倍滑动滤波

 

16倍滑动滤波

 

64倍滑动滤波

 

2.3 FPGA实现

1. 代码实现参考Move_Mean_filter工程

`timescale 1ns / 1ps /****************************************************************************************************** **Author :CKM **E-mail :[email protected] **Times :2022/4/10 **Editor :vs_code/notepad++ **EDATools :vivado 2017.4 **Module_name :move_mean_filter **Functions :实现输入数据DATA_NUM位,MUL_NUM倍滑动滤波算法 *******************************************************************************************************/ module move_mean_filter#( parameter DATA_NUM = 24 ,//数据位宽 parameter MUL_NUM = 8 ,//滑动倍数 parameter MOV_NUM = 3 )( input clk_i , input rst_n , input [DATA_NUM-1 : 0] Ain , output reg [DATA_NUM-1 : 0] Aout ); /*---------------------------------------------常量定义------------------------------------------------*/ localparam IDLE = 6'b000_001 ;//空闲状态 localparam INIT_NUM = 6'b000_010 ;//初始化赋值状态 localparam INIT_MEAN = 6'b000_100 ;//初始化赋值缓冲状态 localparam NUM = 6'b001_000 ;//滑动滤波状态 localparam NUM_BUFF = 6'b010_000 ;//滑动滤波缓冲状态 localparam MEAN = 6'b100_000 ;//等待状态 /*---------------------------------------------变量定义------------------------------------------------*/ reg [ 5 : 0] current_state ;//现态 reg [ 5 : 0] next_state ;//次态 reg [DATA_NUM - 1 : 0] Ain_temp1 ;//输入数据缓冲1 reg [DATA_NUM - 1 : 0] Ain_temp2 ;//输入数据缓冲2 reg [31 : 0] init_cnt ;//初始化计数器 reg [ 7 : 0] buffer_cnt ;//初始化计数器 reg [47 : 0] init_num ;//初始化数据和 reg [47 : 0] num ;//数据和 reg [24 : 0] A ; reg [ 7 : 0] B ; reg [24 : 0] C ; wire [47 : 0] P ; wire [47 : 0] PCOUT ; /*---------------------------------------------程序开始------------------------------------------------*/ //输入数据缓冲 always @(posedge clk_i or negedge rst_n) begin if(!rst_n)begin Ain_temp1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3