c语言使用matlab生成的滤波头文件
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;}。
matlab中滤波器函数filter的c语言实现

最近使用matlab对传感器采集的数据进行低通滤波处理,选定的是切比雪夫I型滤波器,使用matlab自带的函数滤波正常,滤波程序如下:1.%设计低通滤波器2.wp=3*2/fs; %通带边界频率15Hz(归一化频率)3.ws=15*2/fs; %阻带边界频率15Hz(归一化频率)4.rp=1;rs=30;Nn=512; %通带波纹和阻带衰减,以及绘制频率特性的数据点数5.[nn,wn]=cheb1ord(wp,ws,rp,rs); %求得数字滤波器的最小阶数和归一化截止频率6.[b,a]=cheby1(nn,rp,wn); %按最小阶数、通带波纹和截止频率设计数字滤波器7.8.DACCx=filter(b,a,ACCx1);%对输入信号进行滤波9.DACCy=filter(b,a,ACCy1);%对输入信号进行滤波10.DACCz=filter(b,a,ACCz1);%对输入信号进行滤波11.12.DGROx=filter(b,a,GROx1);%对输入信号进行滤波13.DGROy=filter(b,a,GROy1);%对输入信号进行滤波复制代码其中ACCx1、ACCy1、ACCz1、GROx1、GROy1是采集的传感器原始数据序列,这里就不再添加数据。
计算出的滤波器参数如下:恩,好的,等直接使用matlab生成C代码试一下,主要是我想先弄清楚filter的计算原理,之前的程序中有一点有问题,递推公式有个符号写错了,修改如下:1.for i=4:len2. y(i)=(b1*x(i)+b2*x(i-1)+b3*x(i-2)+b4*x(i-3)-a2*y(i-1)-a3*y(i-2)-a4*y(i-3));3.end复制代码但是因为是递推来计算差分方程,所以差分方程的前三个值的确定方法和递推方法不太一样,但是我不知道怎么确定y(t)的前三个值。
所以直接抄用matlab的滤波函数计算出来的y(t)的前三个值带入,但是只有前几十个数据与matlab的filter函数计算相同,其他值计算的结果不一样,也不知道哪里有问题。
基于MATLAB与CCS的FIR滤波器设计与实现

基于MATLAB与CCS的FIR滤波器设计与实现FIR滤波器(Finite Impulse Response Filter)是一种常用的数字滤波器,特点是系统的冲激响应为有限长度,所以也称为有限冲激响应滤波器。
FIR滤波器具有线性相位特性、较好的频率响应控制以及稳定性等优点。
在MATLAB和CCS软件中,我们可以使用不同的方法来设计和实现FIR滤波器。
首先,我们来介绍如何在MATLAB中设计和实现FIR滤波器。
MATLAB 提供了fir1函数来设计FIR滤波器。
该函数可以根据给定的滤波器阶数和截止频率来生成FIR滤波器系数。
例如,如果我们想设计一个截止频率为0.2的10阶低通FIR滤波器,可以使用以下代码:```MATLABorder = 10; % 滤波器阶数cutoff = 0.2; % 截止频率b = fir1(order, cutoff); % 设计FIR滤波器```生成的滤波器系数b可以用于过滤输入信号。
例如,我们可以使用filter函数将一个输入信号x通过滤波器进行滤波:```MATLABx=...;%输入信号y = filter(b, 1, x); % 通过滤波器滤波```在CCS软件中,我们可以使用DSP/BIOS中提供的模块来实现FIR滤波器。
首先,我们需要在CCS中创建一个新的项目,然后配置DSP/BIOS Kernel环境。
接下来,我们可以使用DSP/BIOS中的算法库或者自定义算法实现FIR滤波器。
使用DSP/BIOS的算法库有两种方式,分别是使用C语言和使用Simulink。
如果我们选择使用C语言,可以使用DSPLIB函数库中的fir 函数来实现FIR滤波器。
fir函数需要提供滤波器系数和输入信号,然后它会返回滤波后的输出信号。
例如,以下是使用C语言实现FIR滤波器的示例代码:```C#include <dsplib.h>float x[N]; // 输入信号float b[M]; // 滤波器系数float y[N]; // 输出信号FIR_firGen(M, b); // 生成滤波器系数for (int i = 0; i < N; i++)y[i] = FIR_fir(x[i], b, M); // 滤波```如果我们选择使用Simulink,可以使用Simulink中提供的滤波器模块构建FIR滤波器。
基于MATLAB与CCS的FIR滤波器的C语言实现

2 Sh o o Ifr t nS i c n n ier g J h uUnvri , i o 10 0 C n ) . co l f nomai ce ea dE gnei ,i o iesy Js u4 6 To e s r h e in f F R iia o pa s f t rh s src i e r p a e,ha i o r e ta t n u e t e d sg o I dg tllw— s le a t tln a h s i i vng c mpa d
f n t n f MA L . T e d sg f dg tl f t r w s ma e b a g a e a d t e smu a in w s u ci so T AB o h e i o ii l a d y C ln u g , n i l t a n a i e h o
Ke wor : l a p a e F R lw— a s f t r TMS 2 y ds i r ne h s I o p s i e ; l 3 0C5 02; MATL 4 AB; CCS; C lng a e a u g
p o r m mi g rga n
0 引 言
b s d o ATLAB n ae nM a d CCS
LI NG h n - i n I S e g q a g ,L AO — Bo hn ,XU — n ,DI Limi g NG i n ,HU a — o g La g Xio y n
( . c ol f h s s n l ti l n ier g Jso iesy Js o 100 hn ; 1S h o yi dE e rc gnei , i uUnvri , i u4 6 0 ,C ia oP ca c aE n h t h
用Matlab的FDAtool生成IIR滤波器参数以及参数生成C语言文件

用Matlab的FDAtool生成IIR滤波器参数MATLAB IIR数字滤波器设计首先我们要明白相关的概念。
数字滤波器设计采用角频率,如何与实际信号频率对应?角频率w,采样频率fs ,实际信号频率f的转换关系为:W = 2*pi* f / fs采样频率的角频率为 2 *pi.数字滤波器的指标,以低通为例【见下图】:当我们设计的滤波器是带通的时候。
其通带截止频率有两个,阻带截止频率也有两个。
截止频率还有另外一个称谓,即边沿频率。
FIR 滤波器可以设计为线性相位,并且总是稳定的。
在多数情况下,FIR滤波器的阶数NFIR 显著大于具有等效幅度响应的IIR滤波器阶数NIIR。
NFIR/NIIR 通常为10的量级或更高. IIR 滤波器通常计算更简便。
在很多应用中,并不要求滤波器具有严格的线性相位,在这些情况下,通常会因计算简便而选择IIR滤波器。
例如在很多语音编码当中的滤波器很多都是IIR滤波器,均衡器一般也用IIR滤波器。
也就是说对实时性要求不是很高的场合可以考虑使用FIR滤波器,当FIR滤波器阶数较长时,可以考虑用FFT去计算。
在设计IIR滤波器时,通常将数字滤波器的设计指标转化成模拟低通原型滤波器的设计指标,从而确定满足这些指标的模拟低通滤波器的传输函数Ha(s),然后再将它变换成所需要的数字滤波器传输函数G(z)。
上述滤波器设计的过程只需要了解其原理。
借助于MATLAB强大的工具,滤波器的设计变得比较简单了。
在MATLAB命令窗口中键入fdatool, 你将启动滤波器设计的图形界面。
你可以从simulink中直接选择数字滤波器控件而启动。
本文主要讲述IIR数字滤波器设计的方法。
对从麦克风进来的信号滤波。
假定我们要把50hz的电频干扰去掉,同时人说话的频率一般不会超过3400hz。
我们设计一个带通滤波器,通带为【80-3200】,采样率为8k。
根据上面的需求,我们把相关的参数改成下面的界面:单击 Design Filter,数秒之后显示如下:可以看出:滤波器的阶数是36,还有一个 sections: 18. 由于在具体实现时一般是以2阶的级联或并联去实现的。
c实现matlab自带的filter函数

27.
}
28.
else
29.
{
30.
y[i] += (b[j]*x[i-j]-a[j]*y[i-j]);
31.
}
32.
}
33.
// if(zi&&i<nfilt-1) y[i] += zi[i]; //zi[i],查分方程可以不计,滤波的表
达式 1.[y, zf] = filter(b ,a, X) 2.[y, zf] = filter(b, a, X, zi)
14.
}
15. }
16.
17. memset(y,0,xlen*sizeof(double));
18.
19. a[0]=0.0;
20. for(i=0;i<xlen;i++)
21. {
22.
for(j=0;i>=j&&j<nfilt;j++)
23.
{
24.
y[i] += (b[j]*x[i-j]-a[j]*y[i-j]);
15. }
16.
17. memset(y,0,xlen*sizeof(double));
18.
19. a[0]=0.0;
20. for(i=0;i<xlen;i++)
21. {
22.
for(j=0;i>=j&&j<nfilt;j++)
23.
{
24.
if(j>0)
25.
{
26.
y[i] += -a[j]*y[i-j];
matlab小波滤波器代码 -回复

matlab小波滤波器代码-回复在MATLAB中实现小波滤波器的代码,可以通过以下步骤来完成:第一步:导入信号数据在MATLAB中,首先需要导入待处理的信号数据。
可以使用`wavread`函数读取声音文件,或者使用`load`函数导入其他格式的数据。
matlab[data, fs] = wavread('sound.wav');这里`data`是读取到的信号数据,`fs`是采样率。
第二步:选择小波基函数小波滤波器通过对信号进行小波变换来实现滤波效果。
在MATLAB 中,可以选择不同的小波基函数进行变换。
常用的小波基函数包括`haar`、`dbN`(N是小波基的阶数)、`coifN`、`symN`等。
这里以`haar`小波基为例。
matlabwaveletName = 'haar';第三步:进行小波变换使用`wavedec`函数进行小波变换,将信号分解为多个尺度的小波系数。
matlab[level1, level2, level3, level4] = wavedec(data, 4, waveletName);这里将信号分解为4个尺度的小波系数,分别存储在`level1`、`level2`、`level3`和`level4`变量中。
第四步:滤波在小波变换后,可以对小波系数进行滤波操作。
可以通过设定一个阈值,将小波系数中小于该阈值的部分设为0,从而达到去噪的效果。
matlabthreshold = 0.5;level1(filteredLevel1 < threshold) = 0;level2(filteredLevel2 < threshold) = 0;level3(filteredLevel3 < threshold) = 0;level4(filteredLevel4 < threshold) = 0;这里使用了一个阈值为0.5的例子,小于该阈值的小波系数将被设为0。
五邑大学-TMS320VC5402定时器实验(DSP报告作业-)

五邑大学实验报告实验课程名称:_______________院系名称:________ 信息工程学院______________专业名称:________ 电子信息工程______________实验项目名称:1、TMS320VC5402定时器实验2、基于DSPLib的FFT程序设计3、基于DSPLib的滤波器程序设计班级:_____ 学号: _______报告人:一、TMS320VC5402定时器实验一实验目的1.了解DSP汇编程序与C语言程序的构成;2.了解DSP程序各段的含义;3.熟悉如何编写中断服务程疗;;4.掌握片内定时器的设置方法;5.掌握长时间间隔的定时器的处理二实验内容1.DSP的初始设置;2.DSP中断向量表的建立;3.定时器的使用;设实验板时钟频率为20MHz,编程实现以下要求:1、TMS320C5402 的时钟频率为100 MHz2、TMS320C5402XF端输出一个周期为500ms的方波,周期性地点亮LED3、采用定时中断方法实现4、用C语言编程,画出程序流程图并给出源代码。
5、上机调试。
三实验背景知识1通用TIMER简介TMS320VC5402的定时器的说明:VC5416中有两个可编程的片上定时器,总共包含有三个可由用户设置的寄存器,并可以申请主机的中断。
这三个寄存器分别为TIM、PRD、TCRo这些寄存器与对应的存贮空间地址如下表所示:Timer 0 AddressTimor 1Address 「5402only)Register Description002>1h OO3Oh TIM Timer register0025h0031 h PRD Timer period register0026h0032h TCR Timer control register时间寄存器(TIM)是一个16位的存贮器映射寄存器,它的值山周期寄存器来进行装载,并且做减一操作。
周期寄存器(PRD)是一个16位的存贮器映射寄存器,它是用来重装时间寄存器(TIM)寄存器的值的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
matlab的fdatool是好东西,不过很多人不知道该怎么使用它生成的C头文件。
这里有个fdatool设计的IIR高通滤波器,采样率400Hz时截止频率1Hz。
设计定型之后,要做些调整。
以下说明中的英文名词有些可能对不上fdatool界面上的原文,请大家意会吧
第一步:
点击菜单中的Edit->Convert Structure 选择Direct Form I ,SOS,(必须是Direct Form I, II 不行)
一般情况下,按照默认设置,fdatool设计都是由二阶部分串联组成的。
这种结构的滤波器稳定性比一个section的要好很多,其他方面的性能也好些。
如果不是的话,点击Convert to second order sections。
这时,滤波器的结构(structure)应该显示为Direct Form I,second order sections
第二步:
选择quantize filter,精度选择single precision floating point (单精度浮点)
之所以不用定点是因为噪声太大,也不容易稳定。
点击菜单中的Targets -> generate c header ,选择export as:single precision floating point (单精度浮点)
填写变量名称时,把NUM改成IIR_B,DEN改成IIR_A,其他不用动,保存为iir_coefs.h
保存好的文件如下:
//一大堆注释
//然后:
/* General type conversion for MATLAB generated C-code */
#include "tmwtypes.h"
/*
* Expected path to tmwtypes.h
* C:\Program Files\MATLAB\R2010a\extern\include\tmwtypes.h
*/
/*
* Warning - Filter coefficients were truncated to fit specified data type. * The resulting response may not match generated theoretical response. * Use the Filter Design & Analysis Tool to design accurate
* single-precision filter coefficients.
*/
#define MWSPT_NSEC 9
const int NL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1 };
const real32_T IIR_B[MWSPT_NSEC][3] = {
{
0.8641357422, 0, 0
},
{
1, -2, 1
},
{
0.9949035645, 0, 0
},
{
1, -1.999938965, 1
},
{
0.9985351563, 0, 0
},
{
1, -1.99987793, 1
},
{
0.9996337891, 0, 0
},
{
1, -1.99987793, 1
},
{
1, 0, 0
}
};
const int DL[MWSPT_NSEC] = { 1,3,1,3,1,3,1,3,1 };
const real32_T IIR_A[MWSPT_NSEC][3] = {
{
1, 0, 0
},
{
1, -1.938049316, 0.9401855469
},
{
1, 0, 0
},
{
1, -1.989501953, 0.9900512695
},
{
1, 0, 0
},
{
1, -1.996887207, 0.9971923828
},
{
1, 0, 0
},
{
1, -1.999084473, 0.9993286133
},
{
1, 0, 0
}
};
第三步:
打开iir_coefs.h把MWSPT_NSEC替换成IIR_NSEC, NL、DL数组删除掉,real32_T改成float ,
其中有一个#include "twmtypes.h",不要它了,删掉改完的文件如下:
#define IIR_NSEC 9
//原来叫做MWSPT_NSEC
const float IIR_B[IIR_NSEC][3] = {
//为什么改为float很明显了吧
{
0.8641357422, 0, 0
},
{
1, -2, 1
},
{
0.9949035645, 0, 0
},
{
1, -1.999938965, 1
},
{
0.9985351563, 0, 0
},
{
1, -1.99987793, 1
},
{
0.9996337891, 0, 0
},
{
1, -1.99987793, 1
},
{
1, 0, 0
}
};
const float IIR_A[IIR_NSEC][3] = {
{
1, 0, 0
},
{
1, -1.938049316, 0.9401855469 },
{
1, 0, 0
},
{
1, -1.989501953, 0.9900512695 },
{
1, 0, 0
},
{
1, -1.996887207, 0.9971923828
},
{
1, 0, 0
},
{
1, -1.999084473, 0.9993286133
},
{
1, 0, 0
}
};
保存文件,然后使用以下代码进行滤波
这段代码是根据Direct Form I 2阶IIR滤波的差分方程编写的
a0*y[n] = b0*x[n] + b1*x[n-1] + b2*x[n-2] - a1*y[n-1] -a2*y[n-2];
//iir_filter.c
#include "datatype.h"
#include "iir_filter.h"
#include "iir_coefs.h"
static float y[IIR_NSEC][3];
static float x[IIR_NSEC+1][3];
int16 iir_filter(int16 in)
{
uint16 i;
x[0][0] = in;
for(i=0;i<IIR_NSEC;i++)
{
y[0] =x[0]*IIR_B[0]+x[1]*IIR_B[1]+x[2]*IIR_B[2]-y[1]*IIR_A[1]-y[2]*IIR_A[2];
y[0] /= IIR_A[0];
y[2]=y[1];y[1]=y[0];
x[2]=x[1];x[1]=x[0];
x[i+1][0] = y[0];
}
if( x[IIR_NSEC][0]>32767) x[IIR_NSEC][0]=32767;
if( x[IIR_NSEC][0]<-32768) x[IIR_NSEC][0]=-32768;
return ((int16)x[IIR_NSEC][0]);
}
//复位滤波器
void iir_reset(void)
{
uint16 i,j;
for(i=0;i<IIR_NSEC+1;i++)
{
for(j=0;j<3;j++)
{
x[j]=0;
}
}
for(i=0;i<IIR_NSEC;i++)
{
for(j=0;j<3;j++)
{
y[j]=0;
}
}
}
//iir_filter.h
#ifndef _IIR_FILTER_H__
#define _IIR_FILTER_H__
int16 iir_filter(int16 x);
void iir_reset(void);
#endif
使用方法:
首先写好iir_coefs.h,然后调用iir_filter.c对数据流进行滤波一个伪代码例子:
while(运行中)
{
保存到SD卡(iir_filter(读取ADC采样值()));
}
记得在开始滤波之前重置滤波器
iir_reset();。