DSP的FIR设计(低通滤波)C语言编写
FIR滤波器设计C语言程序
}
case 7:
{ w=kaiser(i,n,beta);//凯塞窗
break;
}
}
return(w);
}
static double kaiser(i,n,beta)//因凯塞窗的表达式复杂,调用贝塞尔窗表达式
int i,n;
double beta;
fs:采样频率*/
void firwin(n,band,fln,fhn,wn,h)
int n,band,wn;
double fln,fhn,h[];
{
int i,n2,mid;
double s,pi,wc1,wc2,beta,delay,fs;
double window();//窗函数的计算
}
case 2:
{ k=(n-2)/10;
if(i<=k)
w=0.5*(1.0-cos(i*pi/(k+1)));//图基窗
break;
}
case 3:
{ w=1.0-fabs(1.0-2*i/(n-1.0));//三角窗
break;
}
int i,n,type;
double beta;
{
int k;
double pi,w;
double kaiser();
pi=4.0*atan(1.0);//pi=PI;
w=1.0;
switch(type)
{
case 1:
{ w=1.0;//矩形窗
break;
h[n-i]=h[i];
}
if(mid==1) h[n/2]=(wc1+pi-wc2)/pi;
基于DSP实现的FIR低通滤波器
基于DSP实现的FIR低通滤波器FIR(有限脉冲响应)低通滤波器是一种常见的数字信号处理(DSP)滤波器。
它的设计和实现非常灵活,可以用于去除数字信号中高频成分,使得信号能在一定的频率范围内进行平滑处理。
FIR低通滤波器有很多种设计方法,其中最简单的方法是基于窗函数设计,例如矩形窗、汉宁窗、布莱克曼窗等。
这些窗函数的选择取决于滤波器的性能要求和频率响应的形状。
在DSP中,FIR低通滤波器的实现可以采用直接形式、级联形式、并行形式和迭代形式等多种结构。
其中直接形式是最简单和直观的实现方式,也是最容易理解和实现的一种结构。
直接形式的FIR低通滤波器由一个延迟线、一组乘法器和加法器组成。
延迟线用于延迟输入信号,乘法器用于对延迟后的信号进行调制,而加法器则将调制后的信号相加得到输出信号。
```----------------------,,,x(n) -->, Delay ,-->, Multiply,-->--+ Sum ,--> y(n)Line ,,,----------------------```在实现过程中,需要注意的是延迟线的设置和乘法器的系数。
延迟线的长度决定了滤波器的阶数,即滤波器对输入信号的响应范围。
乘法器的系数则决定了滤波器的频率响应,可以通过窗函数的选取来确定。
通常,FIR滤波器的实现可以通过查表法或者卷积法来实现。
查表法通过预先计算所有可能的输入组合,并将其存储在一张查找表中,以减少计算量。
卷积法则通过将输入信号和滤波器的冲击响应进行卷积运算来得到输出信号。
当实现FIR低通滤波器时,还需要考虑滤波器的性能指标和算法的优化。
常见的性能指标包括滤波器的截止频率、抗混叠性能、通带和阻带的幅频特性等。
算法的优化可以从以下几个方面考虑:乘法器的系数选择、滤波器结构的选择、滤波器长度的选择和存储器的优化等。
总之,基于DSP实现的FIR低通滤波器是一种常用的数字信号处理滤波器,它可以用于去除数字信号中的高频成分,平滑信号的频谱。
c语言写的fir低通滤波器
根据fir滤波器的公式y(n)=∑h(m)x(n-m);(m: 0~(N-1)).利用MATLAB产生滤波器系数(h(n))并归一化,下面为一个LP滤波算法void filter(void){uint16 i,j;fp32 sum;int16 x1[2030];fp32 h[19]={ -0.0027, -0.0025, 0.0050, 0.0157, -0.0000, -0.0471, -0.0482, 0.0838, 0.2953, 0.4013,0.2953, 0.0838, -0.0482, -0.0471, -0.0000,0.0157, 0.0050, -0.0025, -0.0027};for(i=0;i<2020;i++)x1[i] = data0[i];for(i=0;i<2020;i++){sum=0.0;for(j=0;j<19;j++){if(i >= j)sum+=h[j]*x1[i-j];else;}data0[i]=(int16)sum;}for(i=0;i<2000;i++){data0[i] = data0[i+20];}}考虑到前19个点为不完全累加和,故抛去前19个点。
(应该是前后各18个点都是不完全累加和,都应该去掉,对于数据分段进入滤波器的情况,应该把前一段的后面数据放到下一段的前面,这段时间我在解调FSK时遇到了这个问题,通过滤波器的数据的分段处理。
)设输入数据x[N],输出数据y[N],滤波器系数h[n]1.直接法(由y(m)=h(0)*x(m)+h(1)*x(m-1)+...+h(N-1)*x(m-n-1));void fir(short x[], short h[], short y[]){int i,j;long long sum;for (j = 0; j < N; j++){sum = 0;for (i = 0; i < n; i++)sum += x[j-i] * h[i];y[j] = sum >> 15;}}乘法器使用次数:N*n2.逆推法:void fir(short x[], short h[], short y[]){int i,j;long sum;for (j = 0; j < n; j++){for (i = 0; i < N; i++){sum = 0;sum = h[j] * x[i]y[i] += sum >> 15;}}}乘法器使用次数:N*n3.倒序法:(输入输出可以是同一量)void fir(short x[], short h[], short y[]) {int i,j;long long sum;for (j = N; j > 0; j--){sum = 0;for (i = n; i > 0; i--)sum += x[j-i] * h[i];y[j] = sum >> 15;}}#include<stdio.h>#include<math.h>#define true 1#define false 0#define n 8#define bufsize 100 /* the buffer size is 100 *//* global declarations */int in_buffer[bufsize]; /* processing data buffers */int out_buffer[bufsize];/* functions */static int processing(int *input, int *output);static void dataio(void);static long round(long a);void main(){int *input = &in_buffer[0];int *output = &out_buffer[0];puts("the 1st experiment started\n");/* loop forever */while(true){/** read input data using a probe-point connected to a host file.* write output data to a graph connected through a probe-point.*/// read the input signal.// if the input file is sine1.dat, the signal contains 300hz,400hz and 500hz.// if the input file is sine2.dat, the signal contains 100hz,400hz and 500hz.// the sampling frequency is 1200hz.dataio();/* remove the frequency compoment of 400hz and 500hz*/processing(input, output);// write the output signal.// the output file is result.dat.dataio();}}/** ======== processing ========** function: apply a low-pass fir filter to input signal and remove the frequency higher than 350hz.** parameters: address of input and output buffers.** return value: true.static int processing(int *input, int *output){int i,size = bufsize;short xx0,x,y;// short z[n]={0,0,0,0,0,0,0,0,0};short z[n]={0,0,0,0,0,0,0,0};//short w[2*n+1]={22,356,155,990,466,220,777,216,777,26,466,9,155,0,22};//short w[2*n+1]={6,457,56,1024,224,418,523,382,784,99,784,43,523};// shortw[2*n+1]={330*2,3299*2,1982*2,6867*2,4955*2,1594*2,6607*2,1065*2,4955*2,109*2,1982*2,17*2, 330*2};//short w[2*n+1]={661,6598,3964,13733,9910,3187,13214,2131,9910,217,3964,34,661};// shortw[2*n+1]={58,5628,526,8192,2105,5883,4913,3829,7369,1543,7369,504,4913,102,2105,14,526,1,5 8};//shortw[2*n+1]={28,4432,280,8192,1259,4883,3356,3975,5873,1509,7048,644,5873,142,3356,30,1259,3, 280,0,28};// short w[2*n+1]={26,651,182,1024,545,421,909,247,909,51,545,11,182,1,26};//shortw[2*n+1]={831,20846,5815,32768,17445,13486,29075,7888,29075,1647,17445,349,5815,21,831}; //short w[2*n+1]={208,5211,1454,8192,4361,3371,7269,1972,7269,412,4361,87,1454,5,208};short w[2*n+1]={101,4356,810,8192,2835,3403,5670,2517,7088,605,5670,193,2835,21,810}; // shortw[2*n+1]={101,4356,810,8192,2835,3403,5670,2517,7088,605,5670,193,2835,21,810,2,101};// shortw[2*n+1]={50,3814,454,8192,1815,3504,4235*,3084,6353,831,6353,349,4235,50,1815,8,454,0,50} ;long y0,z0;//22222222222222while(size--){xx0=*input++;x=xx0*6;z0=(long)x<<15;y0=0;for(i=0;i<n;i++){z0-=(long)w[2*i+1]*(long)z[i];y0+=(long)w[2*i+2]*(long)z[i];}y0+=(long)w[0]*(z0>>15);y0=round(y0);for(i=n-1;i>0;i--)z[i]=z[i-1];z0=round(z0);z[0]=(short)(z0>>15);y=(short)(y0>>15);*output++ =y;}/* additional processing load */return(true);/** ======== dataio ========** function: read input signal and write processed output signal. ** parameters: none.** return value: none.*/static void dataio(){/* do data i/o */return;}static long round(long a){long x3;x3=a&(0xffff0000);return x3;}。
fir滤波 c语言
fir滤波 c语言英文回答:FIR (Finite Impulse Response) filtering is a commonly used technique in digital signal processing. It is a type of digital filter that uses a finite number of past input samples to calculate the current output sample. FIR filters have a linear phase response, which means they do not introduce any phase distortion to the filtered signal.In C language, FIR filtering can be implemented using convolution. The filter coefficients, also known as the impulse response, are multiplied with the input samples and summed to produce the output sample. The filtercoefficients determine the frequency response of the filter and can be designed to achieve specific filtering characteristics, such as low-pass, high-pass, or band-pass filtering.Here is an example of FIR filtering in C:c.#define FILTER_LENGTH 5。
DSP的FIR设计低通滤波C语言编写
DSP的FIR设计低通滤波C语言编写FIR(有限脉冲响应)滤波器是一种常用的数字滤波器,用于数字信号处理中的滤波操作。
FIR滤波器的设计通常包括两个主要步骤:滤波器的规格化和滤波器系数的计算。
滤波器的规格化是指确定滤波器的采样频率,截止频率以及陷波增益等参数。
在设计低通FIR滤波器时,我们需要确定滤波器的截止频率。
假设我们希望设计一个截止频率为Fs/4的低通FIR滤波器,其中Fs是采样频率。
根据滤波器设计的基本原理,我们可以得到滤波器的频率响应公式为:H(k) = (2 * Fs/4 * sin(2 * pi * Fs/4 * k))/(pi * k)其中,k是从0到N-1的整数序列,N是滤波器的长度。
经过频域设计,我们可以通过计算滤波器的频率响应公式来获得滤波器的系数。
接下来,我们将使用C语言编写一个低通FIR滤波器的代码示例。
在这个示例中,我们将实现一个截止频率为Fs/4的低通FIR滤波器,采样频率为Fs。
代码如下:```c#include <stdio.h>#include <stdlib.h>#include <math.h>//定义滤波器的长度#define N 51//定义采样频率//定义滤波器的截止频率#define Fc (Fs/4)//计算滤波器的系数void calculateCoefficients(float* coefficients)float sum = 0;for (int k = 0; k < N; k++)if (k == N/2)coefficients[k] = 2 * Fc/Fs;} elsecoefficients[k] = (sin(2.0 * M_PI * Fc * (k - N/2) / Fs)) / (M_PI * (k - N/2));}sum += coefficients[k];}//归一化滤波器的系数for (int k = 0; k < N; k++)coefficients[k] /= sum;}//应用滤波器void applyFilter(float* input, float* output, float* coefficients, int length)for (int n = 0; n < length; n++)output[n] = 0;for (int k = 0; k < N; k++)if (n - k >= 0)output[n] += input[n - k] * coefficients[k];}}}int mai//定义输入信号和输出信号的长度int length = 100;//为输入信号和输出信号分配内存空间float* input = (float*)malloc(length*sizeof(float));float* output = (float*)malloc(length*sizeof(float));//为滤波器的系数分配内存空间float* coefficients = (float*)malloc(N*sizeof(float));//生成输入信号for (int n = 0; n < length; n++)input[n] = sin(2.0 * M_PI * 1000 * n / Fs);}//计算滤波器的系数calculateCoefficients(coefficients);//应用滤波器applyFilter(input, output, coefficients, length); //打印输出信号for (int n = 0; n < length; n++)printf("%f\n", output[n]);}//释放内存空间free(input);free(output);free(coefficients);return 0;```在上面的代码示例中,我们首先定义了滤波器的长度、采样频率以及截止频率。
FIR低通滤波器C语言实现
provided that
* the above copyright notice and this license appear in all
第1页
文文: C:\Documents and Settings\user\桌桌\FirAlgs.c 2009-3-27 27, 15:53:51
source copies. * THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY OF * ANY KIND. See /wol.htm for more information. * ************************************************************** ***************/
implement FIR filters
* in C.
*
* Copyright 2000 by Grant R. Griffin
*
* Thanks go to contributors of comp.dsp for teaching me some
of these
* techniques, and to Jim Thomas for his review and great
not very
* efficient in C, and are provided here mainly to illustrate
FIR
* algorithmic concepts. However, the functions fir_split,
fir_double_z
* and fir_double_h are all fairly efficient ways to
基于DSP的FIR滤波器的C语言算法实现
得到 17 个滤波器系数转化成 Q15 格式, 即分别乘以 32768( 215 ) , 转化成 Q15 格式的滤波器系数如下 :
h [ ] = { 0, 158, 263, - 290, - 1406, - 951, 3186, 9287, 12272, 9287, 3186, - 951, - 1406, - 290, 263, 158, 0} 。
信号与信息处理
基于 DSP 的 FIR 滤波器的 C 语言算法实现
史明泉
( 内蒙古科技大学 信息工程学院, 内蒙古 包头 014010)
摘 要 有 限冲 激 响应 ( FIR ) 滤 波器 是 数字 信 号处 理系 统 中最 基本 的 元件 , 具 有 严格 的 线 性相 频 特 性 , 同 时 其 单位抽 样 响 应 是 有 限 长 的 , 系 统 稳 定 。 阐 述 了 FIR 的 基 本 原 理 , 并 进 行 了 MATLAB 仿 真 。 基 于 T I 公 司 的 TMS320VC5402 DSP 硬件 平 台 , 设 计 了 FIR 低 通 滤 波 器 。 采 用 C 语 言 算 法 , 利 用 集 成 开 发 环 境 代 码 调 式 器 ( Code Composer Studio, CCS ) 分 别观 察 了输 入和 输 出波 形 , 验 证了 此算 法 的 准 确 性 和 高 效 性 , 对 信 号 处 理 及 信 号 传 输 有 重 要的 研究 意 义。 关键词 FIR 滤波器 ; 数字信号处理 ; DSP; 算法 中图分类号 TN713 文献标识码 A 文章编号 1003- 3106( 2011) 01- 0013- 02
图1
收稿日期 : 2010 10 08
fir滤波器的c语言实现
fir滤波器的c语言实现读者对于fir滤波器的c语言实现的过程和细节问题。
具体步骤如下:第一步:fir滤波器的基本原理fir滤波器,即有限脉冲响应滤波器。
它是一种数字滤波器,通过对输入信号进行加权求和,得到输出信号。
其中,加权系数是固定的,称作滤波器的冲激响应(也称为系统函数)。
fir滤波器的传递函数为:H(z) = b0 + b1z^-1 + ... + bNz^-N其中,b0, b1, ... , bN为滤波器的系数。
为了得到输出信号,必须采样输入信号,并且对其进行加权求和。
如下所示:y[n] = b0x[n] + b1x[n-1] + ... + bNx[n-N]其中,x[n]为输入信号。
第二步:fir滤波器的实现步骤fir滤波器的实现步骤分为以下几个步骤:1. 定义滤波器系数数组fir滤波器的系数b0, b1, ... , bN可以由多种方式计算得出。
常用的方法有窗函数法、最小二乘法和频域设计法。
对于fir滤波器的实现,我们首先需要定义滤波器系数数组。
例如:float b[6] = {0.1, 0.2, 0.3, 0.2, 0.1, 0.1};这里我们定义一个长度为6的滤波器系数数组,分别为0.1,0.2,0.3,0.2,0.1,0.1,可以根据实际情况修改。
2. 定义输入和输出缓冲区为了实现fir滤波器,我们需要定义输入和输出缓冲区。
输入缓冲区存储每个采样点的输入信号,输出缓冲区存储每个采样点的输出信号。
通常情况下,输入和输出缓冲区的长度应该分别为滤波器的长度加1。
例如:float x[7] = {0, 0, 0, 0, 0, 0, 0};float y[7] = {0, 0, 0, 0, 0, 0, 0};这里我们定义了长度为7的输入和输出缓冲区。
fir滤波器需要对输入信号进行采样和更新缓冲区。
具体实现方法如下:采样x[0] = input;更新缓冲区for (int i = 6; i > 0; i) {x[i] = x[i-1];y[i] = y[i-1];}4. 计算加权和fir滤波器的核心是计算加权和,具体实现方法如下:float output = 0;for (int i = 0; i < 6; ++i) {output += b[i] * x[i];}计算完加权和后,需要更新输出缓冲区。
(完整word版)c语言写的fir低通滤波器
根据fir滤波器的公式y(n)=∑h(m)x(n-m);(m: 0~(N-1)).利用MATLAB产生滤波器系数(h(n))并归一化,下面为一个LP滤波算法void filter(void){uint16 i,j;fp32 sum;int16 x1[2030];fp32 h[19]={ -0.0027, -0.0025, 0.0050, 0.0157, -0.0000, -0.0471, -0.0482, 0.0838, 0.2953, 0.4013,0.2953, 0.0838, -0.0482, -0.0471, -0.0000,0.0157, 0.0050, -0.0025, -0.0027};for(i=0;i<2020;i++)x1[i] = data0[i];for(i=0;i<2020;i++){sum=0.0;for(j=0;j<19;j++){if(i >= j)sum+=h[j]*x1[i-j];else;}data0[i]=(int16)sum;}for(i=0;i<2000;i++){data0[i] = data0[i+20];}}考虑到前19个点为不完全累加和,故抛去前19个点。
(应该是前后各18个点都是不完全累加和,都应该去掉,对于数据分段进入滤波器的情况,应该把前一段的后面数据放到下一段的前面,这段时间我在解调FSK时遇到了这个问题,通过滤波器的数据的分段处理。
)设输入数据x[N],输出数据y[N],滤波器系数h[n]1.直接法(由y(m)=h(0)*x(m)+h(1)*x(m-1)+...+h(N-1)*x(m-n-1));void fir(short x[], short h[], short y[]){int i,j;long long sum;for (j = 0; j < N; j++){sum = 0;for (i = 0; i < n; i++)sum += x[j-i] * h[i];y[j] = sum >> 15;}}乘法器使用次数:N*n2.逆推法:void fir(short x[], short h[], short y[]){int i,j;long sum;for (j = 0; j < n; j++){for (i = 0; i < N; i++){sum = 0;sum = h[j] * x[i]y[i] += sum >> 15;}}}乘法器使用次数:N*n3.倒序法:(输入输出可以是同一量)void fir(short x[], short h[], short y[]) {int i,j;long long sum;for (j = N; j > 0; j--){sum = 0;for (i = n; i > 0; i--)sum += x[j-i] * h[i];y[j] = sum >> 15;}}#include<stdio.h>#include<math.h>#define true 1#define false 0#define n 8#define bufsize 100 /* the buffer size is 100 *//* global declarations */int in_buffer[bufsize]; /* processing data buffers */int out_buffer[bufsize];/* functions */static int processing(int *input, int *output);static void dataio(void);static long round(long a);void main(){int *input = &in_buffer[0];int *output = &out_buffer[0];puts("the 1st experiment started\n");/* loop forever */while(true){/** read input data using a probe-point connected to a host file.* write output data to a graph connected through a probe-point.*/// read the input signal.// if the input file is sine1.dat, the signal contains 300hz,400hz and 500hz.// if the input file is sine2.dat, the signal contains 100hz,400hz and 500hz.// the sampling frequency is 1200hz.dataio();/* remove the frequency compoment of 400hz and 500hz*/processing(input, output);// write the output signal.// the output file is result.dat.dataio();}}/** ======== processing ========** function: apply a low-pass fir filter to input signal and remove the frequency higher than 350hz.** parameters: address of input and output buffers.** return value: true.static int processing(int *input, int *output){int i,size = bufsize;short xx0,x,y;// short z[n]={0,0,0,0,0,0,0,0,0};short z[n]={0,0,0,0,0,0,0,0};//short w[2*n+1]={22,356,155,990,466,220,777,216,777,26,466,9,155,0,22};//short w[2*n+1]={6,457,56,1024,224,418,523,382,784,99,784,43,523};// shortw[2*n+1]={330*2,3299*2,1982*2,6867*2,4955*2,1594*2,6607*2,1065*2,4955*2,109*2,1982*2,17*2, 330*2};//short w[2*n+1]={661,6598,3964,13733,9910,3187,13214,2131,9910,217,3964,34,661};// shortw[2*n+1]={58,5628,526,8192,2105,5883,4913,3829,7369,1543,7369,504,4913,102,2105,14,526,1,5 8};//shortw[2*n+1]={28,4432,280,8192,1259,4883,3356,3975,5873,1509,7048,644,5873,142,3356,30,1259,3, 280,0,28};// short w[2*n+1]={26,651,182,1024,545,421,909,247,909,51,545,11,182,1,26};//shortw[2*n+1]={831,20846,5815,32768,17445,13486,29075,7888,29075,1647,17445,349,5815,21,831}; //short w[2*n+1]={208,5211,1454,8192,4361,3371,7269,1972,7269,412,4361,87,1454,5,208};short w[2*n+1]={101,4356,810,8192,2835,3403,5670,2517,7088,605,5670,193,2835,21,810}; // shortw[2*n+1]={101,4356,810,8192,2835,3403,5670,2517,7088,605,5670,193,2835,21,810,2,101};// shortw[2*n+1]={50,3814,454,8192,1815,3504,4235*,3084,6353,831,6353,349,4235,50,1815,8,454,0,50} ;long y0,z0;//22222222222222while(size--){xx0=*input++;x=xx0*6;z0=(long)x<<15;y0=0;for(i=0;i<n;i++){z0-=(long)w[2*i+1]*(long)z[i];y0+=(long)w[2*i+2]*(long)z[i];}y0+=(long)w[0]*(z0>>15);y0=round(y0);for(i=n-1;i>0;i--)z[i]=z[i-1];z0=round(z0);z[0]=(short)(z0>>15);y=(short)(y0>>15);*output++ =y;}/* additional processing load */return(true);/** ======== dataio ========** function: read input signal and write processed output signal. ** parameters: none.** return value: none.*/static void dataio(){/* do data i/o */return;}static long round(long a){long x3;x3=a&(0xffff0000);return x3;}。
fir带通滤波器c语言
fir带通滤波器c语言
【原创版】
目录
1.介绍 fir 带通滤波器
2.介绍 c 语言编程
3.讲解如何使用 c 语言实现 fir 带通滤波器
4.结论
正文
一、介绍 fir 带通滤波器
fir 带通滤波器是一种数字滤波器,可以用来过滤信号,使其在一定频率范围内通过,而在其他频率范围内阻止。
这种滤波器在信号处理、通信等领域有着广泛的应用。
二、介绍 c 语言编程
c 语言是一种通用的、过程式的计算机程序设计语言,广泛应用于底层开发和系统编程。
它具有良好的性能和灵活性,是许多其他编程语言的基础。
三、讲解如何使用 c 语言实现 fir 带通滤波器
要使用 c 语言实现 fir 带通滤波器,需要先了解其基本原理。
fir 带通滤波器的核心是滤波器系数,根据这些系数可以编写出滤波器的程序。
具体步骤如下:
1.定义滤波器长度和滤波器系数
2.初始化一个长度与滤波器长度相同的数组,用于存储滤波后的信号
3.遍历输入信号,将每个元素与对应滤波器系数相乘,然后将结果累加到滤波后的信号数组中
4.输出滤波后的信号
四、结论
通过以上步骤,我们可以使用 c 语言实现 fir 带通滤波器,从而在实际应用中对信号进行处理。
DSP的FIR设计低通滤波C语言编写
一、设计目的低通滤波器设计。
本设计中使用的信号为信息信号:signal=sin(2*pi*sl*n*T)高频噪声 1:noise1=*sin(2*pi*ns1*n*T)高频噪声 2:noise2=*sin(2*pi*ns2*n*T)混淆信号:x=(signal+noise1+noise2)此中 sl=500Hz, ns1=3000Hz, ns2=8000Hz,T=1/20000。
混淆信号波形为滤波器输入信号波形,信息信号波形为输出信号波形,滤波器的成效为滤除两个高频噪声。
FIR滤波器基本理论(1) FIR 滤波器的特色数字滤波器的功能,就是把输入序列经过必定的运算变换成输出序列。
它的实现方法有好多,此中比较常用到的是无穷长脉冲响应滤波器IIR 和有限长脉冲响应滤波器 FIR两种。
在计算量相等的状况下, IIR 数字滤波器比 FIR滤波器的幅频特征优胜,频次选择性也好。
可是,它有着致命的弊端,其相位特征不好控制。
它的相位特征f( )argH(e j ) 是使频次产生严重的非线性的原由。
可是在图像办理、数据传输等波形传达系统中都愈来愈多的要求信道拥有线性的相位特征。
在这方面 FIR 滤波器拥有它独到的长处,设 FIR滤波器单位脉冲响应 h(n)长度为 N,其系统函数H(z)为N 1H (z)h(n)z nn 0H(z)是z1的(N-1)次多项式,它在 z 平面上有 (N-1)个零点,原点 z=0 是(N-1)阶重极点。
所以, H(z)永久稳固,它能够在幅度特征任意设计的同时,保证精准、严格的线性相位。
(2)FIR滤波器的基本结构数字滤波是将输入的信号序列,按规定的算法进行办理,进而获取所希望的输出序列, FIR滤波器的差分方程为:N 1y(n)a k x(n k )k 0对上式进行 Z 变换获取 FIR滤波器的传达函数为:Y z N 1H z b k z kX z i 0由上式能够看出, H(z)是z1的 N-1 次多项式,它在 z 平面内有 N-1 个零点,同时在原点处有 N-1 个重极点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、设计目的低通滤波器设计。
本设计中使用的信号为信息信号: signal=sin(2*pi*sl*n*T)高频噪声1:noise1=0.7*sin(2*pi*ns1*n*T) 高频噪声2:noise2=0.4*sin(2*pi*ns2*n*T) 混合信号: x=(signal+noise1+noise2)其中sl=500Hz ,ns1=3000Hz ,ns2=8000Hz ,T=1/20000。
混合信号波形为滤波器输入信号波形,信息信号波形为输出信号波形,滤波器的效果为滤除两个高频噪声。
二、FIR 滤波器基本理论(1)FIR 滤波器的特点数字滤波器的功能,就是把输入序列通过一定的运算变换成输出序列。
它的实现方法有很多,其中比较常用到的是无限长脉冲响应滤波器 IIR 和有限长脉冲响应滤波器FIR 两种。
在计算量相等的情况下,IIR 数字滤波器比FIR 滤波器的幅频特性优越,频率选择性也好。
但是,它有着致命的缺点,其相位特性不好控制。
它的相位特性)argH( )f(ωωj e =是使频率产生严重的非线性的原因。
但是在图像处理、数据传输等波形传递系统中都越来越多的要求信道具有线性的相位特性。
在这方面 FIR 滤波器具有它独特的优点,设FIR 滤波器单位脉冲响应h(n)长度为N ,其系统函数H(z)为∑-=-=10)()(N n n z n h z HH(z)是1-z 的(N-1)次多项式,它在z 平面上有(N-1)个零点,原点z=0是(N-1)阶重极点。
因此,H(z)永远稳定,它可以在幅度特性随意设计的同时,保证精确、严格的线性相位。
(2)FIR 滤波器的基本结构数字滤波是将输入的信号序列,按规定的算法进行处理,从而得到所期望的输出序列,FIR 滤波器的差分方程为:∑-=-=1)()(N k k k n x a n y对上式进行Z 变换得到FIR 滤波器的传递函数为:()()()∑-=-==10N i kk z b z X z Y z H由上式可以看出,H(z)是1-z 的N-1次多项式,它在z 平面内有N-1个零点,同时在原点处有N-1个重极点。
N 阶滤波器通常采用N 个延迟单元、N 个加法器与N+1个乘法器,取图中(a)、(b)两种结构。
图 FIR 滤波器的一般结构因为FIR 滤波器的单位抽样响应是有限长的,所以它永远是稳定的。
另外,若对 h(n)提出一些约束条件,那么可以很容易地使 H(z)具有线性相位,这在信号处理的很多领域是非常重要的。
FIR 滤波器的设计任务,是要决定一个转移函数H(z),使它的频率响应满足给定的要求。
这里所说的要求,除了通带频率p ω、阻带频率及两个带上的最大和最小衰减p ∂和s ∂外,很重要的一条是保证H(z)具有线性相位。
(3)Chebyshev 逼近法窗函数法和频率采样法设计出的滤波器的频率特性都是在不同意义上对所给理想频率特性()jw d e H 的逼近。
由数值逼近理论可知,对某个函数f(x)的逼近一般有以下三种方法:插值法(Interpolating Way)最小平方逼近法(Least Square Approaching Way) 一致逼近法(Consistent Approaching Way)切比雪夫最佳一致逼近的基本思想是,对于给定区间[a ,b]上的连续函数()x f ,在所有n 次多项式的集合n ϕ中,寻找一个多项式 p(x),使它在[a ,b]上对()x f 的偏差和其它一切属于n ϕ的多项式 p(x)对f(x)的偏差相比是最小的,即()()()()(){}x f x p x f x p-=-max min ˆmax 切比雪夫逼近理论,这样的多项式是存在的,且是唯一的,并指出了构造这种最佳一致逼近多项式的方法,就是有名的“交错点组定理”。
切比雪夫逼近理论解决了p(x)的存在性、唯一性和如何构造等问题。
J.H.McClellan 、T.W.Parks 、L.R.Rabiner 等人应用切比雪夫逼近理论提出了一种设计FIR 滤波器的计算机辅助算法。
这种算法由于是在一致意义上对()jw d e H 作最佳逼近,因而获得了较好的通带和阻带性能,并能准确地指定通带和阻带的边缘。
但它的效率依赖于初始极值频率点的估计,且通带和阻带内波纹数较多,这是Chebyshev 方法的两个主要缺点。
三、FIR 滤波器的MATLAB 实现MATLAB 辅助DSP 实现FIR ,其总体过程为在DSP 中编写处理程序,在MATLAB 中利用滤波器设计、分析工具( FDATOOL) ,根据指定的滤波器性能快速设计一个FIR ,再把滤波器系数以头文件形式导入CCS 中,头文件中MATLAB 辅助DSP 实现FIR 数字滤波器含滤波器阶数和系数数组,在MATLAB 中调试、运行DSP 程序并显示、分析处理后的数据。
使用该方法,便于采用汇编语言来实现程序。
头文件名不变,当MATLAB 中设计的滤波器系数改变时,相应头文件中系数也改变,方便程序调试、仿真。
(1)输入信号的产生首先利用Matlab 产生导入CCS 的dat 文件,具体实现如下代码所示 sl=500; %有效信号 ns1=3000; %高频噪声 ns2=8000; %高频噪声 fs=20000; %采样频率 N=1000; T=1/fs; n=0:N;signal=sin(2*pi*sl*n*T);noise1=0.7*sin(2*pi*ns1*n*T); noise2=0.4*sin(2*pi*ns2*n*T);x=(signal+noise1+noise2);%待滤波信号 figure(1) plot(x) figure(2)y=abs(fft(x));%待滤波频谱 df=n*(fs/N); plot(df,y) figure(3) plot(signal) figure(4)ysignal=abs(fft(signal));%滤波后频谱 df=n*(fs/N); plot(df,ysignal) %滤波数据导出xout=x/max(x); %归一化xto_css=round(32767*xout);%数据取整xoutcss=xto_css;fid=fopen('input.dat','w'); %打开文件fprintf(fid,'1651 1 0 0 0\n');%输出文件头fprintf(fid,'%d\n',xoutcss); %输出fclose(fid);产生的时域波形如图所示:图输入信号波形频谱如图所示:x 10图输入频谱经过滤波器后的预期时域波形如图:图输出时域波形频谱如图所示x 10图输出频谱(2)滤波器的设计MATLAB集成了一套功能强大的滤波器设计工具FDATool(Filter Design & Analysis Tool),可以完成多种滤波器的设计、分析和性能评估。
a.打开Filter Design & Analysis Tool单击MATLAB主窗口下方的“Start”按钮,选择菜单“ToolBox”→“Filter Design”→“Filter Design & Analysis Tool(FDATool)”命令,打开FDATool,如图所示。
图fadatool的启动b.产生滤波器阶数为81阶,这里应填80,比阶数少1。
窗函数选择切比雪夫型(chebyshev),采样频率为20000Hz,通带截止频率为750Hz。
图滤波器的幅频特性图滤波器的相位特性c.产生滤波器系数和头文件图滤波器系数图头文件的产生最后将产生的头文件中的滤波器系数数组放入编写好的滤波器函数中,并在进行CCS中进行调试与测试。
四、FIR滤波器的Simulink仿真通过Matlab的FDATOOL设计滤波器后,为了确认该滤波器是否有效,现通过simulink进行建模仿真观察该滤波器是否有效。
把三个信号通过加法器相加后,再通过FDATOOL设计的滤波器即可。
注意此处设计的是数字滤波器,需要把三个输入信号数字化。
具体仿真模型建立如下:分别观察滤波前后的时域波形图图滤波前时域波形图 滤波后时域波形五、FIR 滤波器的DSP 实现(1)DSP 中滤波器的1-z 算法实现FIR 滤波器的输出表达式为1/2100()()()()()N N n n y n h i x n i h i s n i --===-=-∑∑式中,为滤波器系数;x(n)表示滤波器在n 时刻的输入;y(n)为n 时刻的输出。
它的基本算法是一种乘法-累加运算,即不断地输入样本x(n),经过延时后,再进行乘法-累加,最后输出滤波结果y(n)。
1)线性缓冲区法:线性缓冲区法又称延迟线法,其特点: (a )对于N 级的FIR 滤波器,在数据存储器中开辟一个N 单元的缓冲区(滑窗),用来存放最新的N 个输入样本;(b )从最老样本开始取数,每取一个样本后,将此样本向下移位; (c )读完最后一个样本后,输入最新样本存入缓冲区的顶部。
2)循环缓冲区法:循环缓冲区法的特点如下: (a )对于N 级FIR 滤波器,在数据存储器中开辟一个N 单元的缓冲区(滑窗),用来存放最新的N 个输入样本;(b )从最新样本开始取数;(c )读完最后一个样本(最老样本)后,输入最新样本来代替最老样本,而其他数据位置不变;(d )用片内BK (循环缓冲区长度)寄存器对缓冲区进行间接寻址,使循环缓冲区地址首尾相邻。
本次设计的FIR 滤波器所采用的就是循环缓冲区法。
(2)C 语言实现FIR采用C语言算法在DSP平台上实现了FIR低通数字滤波器,C语言算法相比于汇编算法可移植性很强。
这里是在TMS320VC5510DSP为平台编写的C语言算法, 此算法可以稍加改动用在其他DSP芯片上, 而汇编算法则不然。
这种方法具有以下优点:(a) 程序的入口和出口由C语言自动管理,不必手工编写汇编程序实现。
(b) 程序结构清晰,可读性强。
(c) 程序调试方便。
由于C程序中的变量全部由C语言来定义,因此采用C 源码调试器可以方便地观察C语言变量。
(d) 可移植性较强,通用性较好。
具体代码如下:#include"stdio.h"#include"fdacoefs.h" //头文件包含滤波器的系数#define N 81 //定义滤波器的阶数为81阶#define Length 200 //定义缓冲区数组大小为200long yn;int input[Length]; //存放输入数据int output[Length]; //存放输出数据void main(){int m,n;int *x;for(n=0;n<Length-1;n++) //循环导入数据{x=&input[n]; //指针指向每次导入的数据yn=0; //每做完一次乘累加后,把值赋给output数组后,从新归0for(m=0;m<N-1;m++)yn+=B[m]*(*(x++)); //做N次的乘累加output[n]=yn; 把值赋给output数组}while(1); //做完滤波后使程序保持在本循环中}(3)CSS仿真调试CCS 是TI 推出的用于开发其DSP 芯片的继承开发调试工具, 集编辑、编译、链接、软件仿真、硬件调试及实时跟踪等功能于一体, 极大地方便了DSP 程序的设计与开发, 此外还提供图形显示功能, 方便用户观察特定地址的波形。