当前位置:首页 » 编程语言 » 基于dsp滤波器c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

基于dsp滤波器c语言

发布时间: 2022-12-20 09:28:03

① 如何用c语言来实现数字滤波器

用C语言实现,希望能给出个完整的已调试好程序,不甚感谢,给你20分问题补充:例子中9、2、14有误,应该是11、2、14
太麻烦了
我只编了一

② 求IIR及FIR数字滤波器的C语言实现。(VC++)

这个问题比较复杂,最近本人也在研究数字滤波,

结合图片说一下

第一个图是fir的流程图,其中Z-1是延迟,是单个采样时间1/fs

n阶的fir滤波器就是选取最近的n+1个样本,然后使他们各自乘以自己的滤波器系数即图中的F(n),[一般其他书的表示是h(n)]

然后相加得到输出的y(n)就是一个输出点

,其中F(n)的得出需要根据采样频率和滤波器的通带和阻带来决定

其中为了改善旁瓣的幅值,一般在采样后给样本或者h(n)加窗,当然可以用“最佳方法”来做

得出h(n)大致方法是先将矩形窗进行DFT,得出h(n),然后对h(n)进行加窗得出h(k),然后将∑h(k)×x(n)=y(n),假如阶数较多可以用傅里叶变换使时域变频域后再将卷积相加,可以利用FFT来改进实时性,提升速度

上面就是fir滤波器的简述

第二个图片上传不了,直接给链接

http://image..com/i?ct=503316480&z=0&tn=imagedetail&word=%D2%BB%BD%D7iir%C2%CB%B2%A8%C6%F7&in=12708&cl=2&cm=1&sc=0&lm=-1&pn=0&rn=1&di=2607528304&ln=1054&fr=

图中的Z-1是延时,iir滤波器也叫无限冲击响应滤波器,是有反馈的,

图中的是一阶的,相对fir滤波器来说,iir滤波器可以用较低的阶数来获得较好的滤波特效。但是其相位特性较差。

鉴于实用性,还是建议楼主去图书馆借书看,网络不可能得到确实的方案,

楼主可以去借“数字信号处理”的书,国外的中译本就有详细介绍fir和iir以及fft还有其他变换,国内的dsp大都几乎是dsp用户手册的中译本,对上述问题都是很简陋地带过,不予置评。

本人推荐一本书在www.ouravr.com上面的dsp专栏有下载,40多M,叫DSP算法、应用和设计,本人有这本实体书,写的较好

③ 懂DSP的来看看吧。由于时间问题,现求助帮忙开发一个基于TMS320VC5509的卡尔曼滤波器程序。详见补充、

我相信你可以自己完成,不是么?

④ 如何利用C语言编写二阶高通滤波器,跪求高手帮助

数字滤波器而已~~搞清原理就简单啦~~~定义个数组,或者把滤波器参数也定义在数组里方便修改,来一个新数据移位一下就行了

⑤ DSP用什么语言 有没有什么书

那要看你用什么片子了,还有老师有什么要求或者工作中有什么要求,一般来说是汇编语言和c语言。我现在在用2407的片子做一个fir滤波器,基本上是用c语言。

汇编虽然比较简单和直观,但是在编程的过程中汇编语言的程序比较长。

相对而言c语言要有一定的基础,编程的时候比较繁琐但是要有一定基础程序可以简单,可以嵌套许多函数什么的,程序分块化处理对于编程的人员就比较轻松了。

不知道你是刚刚学习还是有了一定的基础(c语言基础),如果想要好好学习的话还是弄本书看看,要简单一点的,弄清楚片子的基本结构和中断的使用,还有就是要实践,多多实践,我在看一本书是专门讲2407片子的使用的,叫做《TMS320X240XDSP原理及应用开发指南》是北京航天航空大学出版社出版的,作者是:赵世廉

还有就是你要用什么样的的片子做东西。TI公司(德州电气公司【美国的公司,世界上也是很着名的公司】)生产的片子有三个系列,他们分别是:C2000,C5000和C6000,性能也是从低到高的,还有什么问题的话还是多多问问老师,和多看看书。。一般而言,2812的片子要好一点,当然看你是不是要处理高频信号,如果是高频信号的话就要跟高级的芯片了,因为处理的速度是高级芯片快但是价格也比较高。做的时候还要考虑成本的问题。

不知道我的答案有没有什么不妥之处。希望我的回答对你有帮助。

⑥ 如何用C语言实现低通滤波器

floatmiddle_filter(floatmiddle_value[],intcount)
{
floatsample_value,data;
inti,j;
for(i=1;ifor(j=count-1;j>=i,--j){
if(middle_value[j-1]=middle_value[j]{
data=middle_value[j-1];
middle_value[j-1]=middle_value[j]
middle_value[j]=data;
}
}
sample_value=middle_value(count-1)/2];
return(sample_value);
}

⑦ 巴特沃斯滤波器c语言实现

说的很对,滤波玩的就是增益(衰减)变化,不同的频率,不同的增益(衰减)。称幅频曲线。
1、巴特奥斯滤波器的截止频率指-3db通频带频率,也就是在这个频率以内保证畅通(通带)。
2、另一个指标叫做阻带,频率大于此值能够保证衰减大于某值

⑧ dsp:FIR滤波器的设计

题目:利用DSP的FIR滤波器设计

数字处理器(DSP)有很强的数据处理能力,它在高速数字信号处理领域有广泛的应用,例如数字滤波、音频处理、图像处理等。相对于模拟滤波器,数字滤波器没有漂移,能够处理低频信号,频率响应特性可做成非常接近于理想的特性,且精度可以达到很高,容易集成等。使用可编程的DSP芯片实现数字滤波可以通过修改滤波器的参数十分方便地改变滤波器的特性,下面主要说明利用TMS320VC54x DSP芯片设计实现FIR数字滤波器。
设计目的意义
一个实际的应用系统中,总存在各种干扰,所以在系统设计中,滤波器的好坏将直接影响系统的性能。使用DSP进行数字处理,可以对一个具有噪声和信号的混合信号源进行采样,再经过数字滤波,滤除噪声,就可以提取有用信号了。所以说,数字滤波器是DSP最基本的应用领域,熟悉基于DSP的数字滤波器能为DSP应用系统开发提供良好的基础。
技术指标
1、数字滤波器的频率参数主要有:①通带截频:为通带与过渡带的边界点,在该点信号增益下降到规定的下限。②阻带截频:为阻带与过渡带的边界点,在该点信号衰耗下降到规定的下限。③转折频率:为信号功率衰减到1/2(约3dB)时的频率,在很多情况下,也常以fc作为通带或阻带截频。④当电路没有损耗时,固有频率:就是其谐振频率,复杂电路往往有多个固有频率。
2、增益与衰耗
滤波器在通带内的增益并非常数。①对低通滤波器通带增益,一般指ω=0时的增益;高通指ω→∞时的增益;带通则指中心频率处的增益。②对带阻滤波器,应给出阻带衰耗,衰耗定义为增益的倒数。③通带增益变化量指通带内各点增益的最大变化量,如果通带增益变化量以dB为单位,则指增益dB值的变化量。
3、阻尼系数与品质因数
阻尼系数α是表征滤波器对角频率为ω0信号的阻尼作用,是滤波器中表示能量衰耗的一项指标,它是与传递函数的极点实部大小相关的一项系数。
4、灵敏度
滤波电路由许多元件构成,每个元件参数值的变化都会影响滤波器的性能。
5、群时延函数
在滤波器设计中,常用群时延函数评价信号经滤波后相位失真程度。
以上的几个技术指标是一般滤波器的特性,但在实际应用中,数字滤波器通常用来实现选频操作,因此在利用DSP实现数字滤波器设计中要求的技术指标主要为在频域中给出的幅频响应和相频响应。如下图所示

幅频响应和相频响应特性曲线
对于幅频响应,它的含义是信号通过系统之后的输出信号的幅度与它输入时的信号的幅度的比值,一般以分贝值表示。对于相频响应,含义是信号通过系统之后的输出信号的相位与它输入时的信号的相位之差,在运用线性相频响应指标进行滤波器设计具有如下优点:①只包含实数算法,不涉及复数运算;②不存在延迟失真,只有固定数量的延迟;③可以采用FFT算法,从而提高运行效率;④由于FIR滤波器的单位脉冲响应是有限长序列,故FIR滤波器没有不稳定的问题,且误差较小。
基本原理
利用DSP实现FIR滤波器的设计方法主要有窗函数法和频率抽样法,其中窗函数法是基本的设计方法,这里采用窗函数法设计FIR滤波器。设希望得到的滤波器理想响应为 ,那么FIR滤波器的设计就在于寻找一个传递函数

去逼进 ,设

这里 就是傅立叶级数的系数。在这种逼近中,最直接的一种方法就是从单位脉冲响应 入手,使 逼近理想的单位脉冲响应 。由于 是一个无限长序列,因此,最简单的方法就是对 做截尾处理,即得到一个近似的传递函数

上式中,Q就是最终确定FIR滤波器的阶数,Q越大,近似程度就越高。对 截尾,实际上就是对 乘上一个矩形窗口 ,即

令z= ,则

其脉冲响应系数为 , ,…, , , ,…, , 。为使 具有因果性,延时Q个样值,可得:

令n+Q=k,上式成为

令 ,N=2Q,得

式中, 是脉冲响应系数,这里 …, ,…, 。
一般来说,FIR数字滤波器输出 的Z变换形式 与输入 的Z变换形式之间的关系如下:

实现结构如下图所示:

Z变换结构图
从上面的Z变换和结构图可以很容易得出FIR滤波器的差分方程表示形式,即对上式进行反Z变换得:

上式为FIR数字滤波器的时域表示方法,其中x(n)是在时间n的滤波器的输入抽样值,根据上式即可对滤波器进行设计。
硬件设计
1、DSP芯片
根据设计原理,实现的核心器件采用美国德州仪器公司生产的低功耗定点数字信号处理器芯片TMS320C5402。选择该芯片主要是因为它是目前最常用的低成本DSP芯片,而且包括以下主要特点:
⑴运算速度快,最快可达532MIPS;
⑵多总线结构,片内共有8 条总线(1条程序存储器总线、3条数据存储总线和4条地址总线);
⑶CPU采用冯? 诺依曼并行结构设计,使其能在一条指令周期内,高速地完成多项算术运算;
⑷片内集成了4K×16bitROM和16K×16bit的双存取RAM;
⑸丰富的片上外围电路(通用I/O 引脚,定时器,时钟发生器, HPI 接口,多通道缓冲串行口McBSP)使其与外部接口方便;
⑹3.3V I/O电压,1.8V核点压,工作电流平均值为75mA,其中核45mA,I/O约30mA;
⑺144脚BGA封装,使体积减少,功耗降低。
2、AD和DA电路
在本数字滤波器系统中选择了TI公司的TLV1570芯片作为模数转换器件,8通道10位2.7到5.5 V低电压模数转换芯片。TLVl570在3V电压下的采样频率为625KSPS,输入信号最高频率不能超过300K。
由于模数转换选择了10位器件,为了简化程序代码,减少DSP 的运算工作量,在本数字滤波器系统中选择了TI公司的TLV5608芯片,它是一款8通道10位2.7到5.5V低电压数模转换芯片。
3、电源电路
根据DSP芯片工作的电压电流需求,及芯片采用双电源供电对加电顺序的要求,考虑使用TI公司的电源转换芯片TPS73HD318,其输出电压为一路3.3V、一路1.8V,每路电源的最大输出电流为750mA,能满足本系统的供电需求。而且TPS73xx具有非常低的静态电流,能使稳压器输出稳定。
4、时钟电路
C54xx系列的时钟端子为X1和X2/CLKIN,采用无源晶振提供时钟信号,由于DSP有一组端子可以用来调整其工作频率的高低,故对晶振频率大小的选定没有特别的要求,这里选用10Mhz的晶振。
5、复位电路
为了克服DSP系统因时钟频率较高导致在运行时可能发生的干扰和被干扰的现象,最好是使用具有监视(Watchdog)功能的自动复位电路,于是采用专门的自动复位芯片MAX706。MAX706的电源为3.1V~5.0V,低电平复位输出,复位门限为3.08V。
6、未用端子处理
根据使用DSP芯片的相关原则,以及芯片手册具体决定未用端子是接上拉电阻还是悬空。
7、基于上述的各部分电路组成,可以得出DSP数字滤波器的整体硬件电路连线图,如下所示

程序设计
1、设计思路
⑴在DSP进行数字滤波运算前首先要进行初始化,只有正确设置了DSP的初始状态才能保证芯片能正常运行。本系统主要进行以下两方面的初始化:
①寄存器初始化:状态寄存器ST0、状态寄存器ST1、处理器模式控制寄存器PMST、软件等待状态寄存器SWWSR、组交换控制寄存器BSCR和时钟模式寄存器等。
②中断矢量表初始化:根据DSP芯片对各中断矢量的设置位置编写一个子程序;设置PMST控制寄存器;连接时将矢量表重定位到IPTR指定的地址。
⑵其次就是FIR 数字滤波的子程序设计,主要步骤如下:
①查询SPCR11寄存器的第二位,当为1时说明read ready,将DRR11的值读入AR3所指向的地址,该值为最新的采样值。
②将最新的采样值减去200h,然后AR3的值减1。
③执行MAC指令。
④将累加器的值送给变量Y,并将Y加上200h。
⑤查询SPCR20寄存器的第二位,当为1时说明writeready,将Y值赋给DXR10,该值为滤波器输出值。
⑥循环执行上面步骤。
2、程序流程图
依据上述程序设计思路可以得到利用DSP实现FIR滤波器设计的程序流程图,如下

3、程序代码
由于初始化程序部分过于庞大繁杂,这里只给出用MAC指令编程实现FIR低通滤波器的程序片断:
FILT_task1
LD Store_SICX,A
STLM A,ar4
STM #1,ar0 ;间址
STM #28,bk
LD DEM_Out,A
STL A,*ar4+% ;输入信号:实部
STM #Coef_Tab1,ar5 ;滤波器实部系数地址
LD #0,A
STM #27,brc
RPTB SICXU-1
MAC *AR4+0%,*AR5+,A
SICXU LD A,-16,A ;低通滤波结果
LD C7FFF,B
MIN A
NEG B
MAX A
STL A,DEM_Out
LDM AR4,A
STL A,Store_SICX
RET
Coef_Tab1
.word 100 ;h(0)
.word 7 ;h(1)

… ;脉冲响应系数

.word -248
.word -71 ;h(N-1)
.end
总结
通过利用DSP的FIR滤波器设计,对DSP芯片的使用,以及利用DSP芯片组成的基本系统的相关电路有了比较深的认识。熟悉DSP芯片的系统设计和应用开发流程,并利用图书馆、网络、询问同学等方式查找资料和解决相关的难题,这是最基础的工作,也是最关键的步骤。这样做可以培养自己的动手解决问题的能力和独立思考的处事方法,使自己具有技术人员的气质和工作态度,为将来的就业增加优势。
数字滤波器是DSP的典型应用,学会了有助于触类旁通,利于进一步的学习研究,能做到理解其他基于DSP的系统的功能和工作原理。掌握了基于DSP的应用开发,开阔了视野,增长了知识,是进入现代数字信号处理领域重要技能,乃至大规模集成电路的开发也是会用到的基础,今后要予以重视并积极努力去学习。
求采纳为满意回答。

⑨ 我做 基于DSP的FFT算法和FIR滤波器的设计与实现 现在有c语言编程出的程序了,我想改成用库函数编写。

DSP厂家会提供FFT和FIR的典型程序,楼主照葫芦画瓢即可

⑩ 二阶滤波器用C语言怎么写

这个可比你想象的复杂多了,s是个复变量,1/(s+1)极点在-1,要想用C语言写,必须理解清楚下面几个问题:
1、输入必须是个有限序列,比如(x+yi),x和y分别是两个长度为N的数组
2、要过滤的频率,必须是个整型值,或者是个整型区间
3、输出结果同样是两个长度为N的数组(p+qi)
4、整个程序需要使用最基本的复数运算,这一点C语言本身不提供,必须手工写复函数运算库
5、实现的时候具体算法还需要编,这里才是你问题的核心。

我可以送你一段FFT的程序,自己琢磨吧,和MATLAB的概念差别很大:
#include <assert.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "complex.h"

extern "C" {

// Discrete Fourier Transform (Basic Version, Without Any Enhancement)
// return - Without Special Meaning, constantly, zero
int DFT (long count, CComplex * input, CComplex * output)
{
assert(count);
assert(input);
assert(output);

CComplex F, X, T, W; int n, i;

long N = abs(count); long Inversing = count < 0? 1: -1;

for(n = 0; n < N ; n++){ // compute from line 0 to N-1

F = CComplex(0.0f, 0.0f); // clear a line

for(i = 0; i < N; i++) {

T = input[i];

W = HarmonicPI2(Inversing * n * i, N);

X = T * W;

F += X; // fininshing a line

}//next i

// save data to outpus
memcpy(output + n, &F, sizeof(F));

}//next n

return 0;
}//end DFT

int fft (long count, CComplex * input, CComplex * output)
{
assert(count);
assert(input);
assert(output);

int N = abs(count); long Inversing = count < 0? -1: 1;

if (N % 2 || N < 5) return DFT(count, input, output);

long N2 = N / 2;

CComplex * iEven = new CComplex[N2]; memset(iEven, 0, sizeof(CComplex) * N2);
CComplex * oEven = new CComplex[N2]; memset(oEven, 0, sizeof(CComplex) * N2);
CComplex * iOdd = new CComplex[N2]; memset(iOdd , 0, sizeof(CComplex) * N2);
CComplex * oOdd = new CComplex[N2]; memset(oOdd , 0, sizeof(CComplex) * N2);

int i = 0; CComplex W;
for(i = 0; i < N2; i++) {
iEven[i] = input[i * 2];
iOdd [i] = input[i * 2 + 1];
}//next i

fft(N2 * Inversing, iEven, oEven);
fft(N2 * Inversing, iOdd, oOdd );

for(i = 0; i < N2; i++) {
W = HarmonicPI2(Inversing * (- i), N);
output[i] = oEven[i] + W * oOdd[i];
output[i + N2] = oEven[i] - W * oOdd[i];
}//next i
return 0;
}//end FFT

void __stdcall FFT(
long N, // Serial Length, N > 0 for DFT, N < 0 for iDFT - inversed Discrete Fourier Transform
double * inputReal, double * inputImaginary, // inputs
double * AmplitudeFrequences, double * PhaseFrequences) // outputs
{
if (N == 0) return;
if (!inputReal && !inputImaginary) return;
short n = abs(N);
CComplex * input = new CComplex[n]; memset(input, 0, sizeof(CComplex) * n);
CComplex * output= new CComplex[n]; memset(output,0, sizeof(CComplex) * n);
double rl = 0.0f, im = 0.0f; int i = 0;
for (i = 0; i < n; i++) {
rl = 0.0f; im = 0.0f;
if (inputReal) rl = inputReal[i];
if (inputImaginary) im = inputImaginary[i];
input[i] = CComplex(rl, im);
}//next i
int f = fft(N, input, output);

double factor = n;
//factor = sqrt(factor);

if (N > 0)
factor = 1.0f;
else
factor = 1.0f / factor;
//end if

for (i = 0; i < n; i++) {
if (AmplitudeFrequences) AmplitudeFrequences[i] = output[i].getReal() * factor;
if (PhaseFrequences) PhaseFrequences[i] = output[i].getImaginary() * factor;
}//next i
delete [] output;
delete [] input;
return ;
}//end FFT

int __cdecl main(int argc, char * argv[])
{
fprintf(stderr, "%s usage:\n", argv[0]);
fprintf(stderr, "Public Declare Sub FFT Lib \"wfft.exe\" \
(ByVal N As Long, ByRef inputReal As Double, ByRef inputImaginary As Double, \
ByRef freqAmplitude As Double, ByRef freqPhase As Double)");
return 0;
}//end main

};//end extern "C"