实例介绍
数字信号处理C语言各种算法实现
567891111111 double Real Time FIR Filter(double *b nt b lenth double *Input Data 12 int Count double Output Data =0; Input data +=b lenth -1 456 for (Count =0; Count< b_Lenth j Count++) 17 18 output Dat (b + Count)) 19 (*(Input Data-Count)) 2 0123 return (double )Output Data 22222 void Save Input Date (double Scand 5678 int Depth double *Input Data) 29 int count for( Count =0 Count Depth -1; Count++) (Input Data Count)=*(Input Data+ Count 1); 3333 345678 *(Input Data Depth-1)=Scand int main(void) 4 0123 double b[]={8.5,-8.5,1} double Scand data 0 char command e 46 int b Lenth =(sizeof(b)sizeof(double)); double Input Datalsizeof(b)/sizeof(double)]=0; double Output Data =0; 52 display printf(" b(k):") for (count =0; Count< b_ Lenth j Count++) 56 printf( %f", b[ Count ]; 57 n 61 Count =0; 62 While (1) 63 if(Count ==0) printf("The Input :" else printf (" The Next Input : ") scanf("%lf",&Scand Data); printf("Input x(%d): %1f Count, Scand Data) 69 78 Save Input Date (Scand Data 71 b Lenth, 72 Input Data) Output Data Real Time FIr Filter(b b Lenth Input Data); 77 printf("Output y(%d): %If \n",Count, Output Data)i scanf("%c",&Command); 81 if(Command = 27)break; //ESC 83. Count++ 84 printf(" \n"); 87, return (int)0; 到此,一个滤波器就实现了,只需要不停的输入输入信号就好了,键可以停止程序。 其单位冲击响应用 表示如下 副)=【05051 S88686 6 m-+ [数字信号处理使用窗函数设计FR滤波器 设计参数 首先,先明白几个概念。通带,阻带,过渡带,通带纹波和阻带纹波分别是什么?看下图, 遷移域 通過域 阻止域 111111 范围 0。称为通,对于许误差而言,[1-8n1+⑧。这个闹,称为通带 纹波。同样的,对于田0可则是阻带,[O.6。]这个范国,称为阻带纹波,中间的黑色部分 是过度带。角频率 称为通带边缘频率 rad 角频率则被称为阻带起始频率 通常的滤波器的设计,都会指明这几个参数,最后设计的滤波器,必须满足这几个参数。当然, 这里举得例子是低通滤波器的,高通或者带通,就与之相反了 理想低通滤波器 首先,先由理想低通滤波器为出发点开始考虑。理想低通滤波器的频响如下所示 e otherside oC o [rad=- 这里的 ,表示截止频率。 先由理想的滤波器出发,求其理想滤波器的单位冲击响应。得到了单位冲击响应,也就得到了 滤波器的系数。这样,我们就设计出了一个理想的滤波器。这是一个完美的想法,那么开始动手吧, 寻找他的单位冲击响应。运用离散时间的傅里叶逆变换,有如下的式子。 h, (n)= 1·e 2丌 jondo? 2兀fn 72万 Sin(@72 sinc(n)n∈(∞,+∞) 由此,我们得到了一个单位冲击响应的表达式(sinc是辛格函数),到这我们就可以设计出 个理想的滤器了吗?好吧,让我们再确认一遍。第一,这个式子是离散的。对于单位冲击响应, 本米貮应该是离散的,没有错,很好,我们距离理想滤波器又近了一步。第二,这个式子所求出的 单位冲击响应的个数,很不幸!个数是无限的。到这里,我们基本可以确定了,理想滤波器是实现 不了的。 虽然理想滤波器是实现不∫的,但是我们可以退一步,从无限的理想滤波器的单位冲击响应中 在选择一部分冲击响应,构成一个不太理想的,但又达到一定标准的滤波器。我们只能“将就”着 使用这个不太理恕的滤波器,那么接下来还有一个问题,我们要如何从无限的数列中选择出有限的 部分,从而达到我们的设计要求。 窗函数 首先,我们先考虑最简单的情况。对于理想单位冲击响应而言,其形状大概和一个高斯分布很 像(当然,只是很像,n=0时候,单位冲击响应的值最大,由两边慢慢减少。当然,可能也岀现负 也就是,值铰大的部分。其余部分则放弃。根据之前的叙述,我们可以使用如下式子表不。分, 值。)!所以,我们为了能使得滤波器的性能接近理想滤波器,那么,我们选择其最主要的部分 N (1)=1,n≤ otherwise 这个式子确实可以帮助我们选择一部分有限的数列。而这个式子,被称为矩形窗。可以看出 N越人,性能越街进理想滤波器。这里N称为窗函数的长度。 这就是我们选定的窗口,然后我们把窗口函数加上,也就是加窗!其实也就一个乘法,如下所 小 h(n)=h(n)o(n) sinc(cn).o(n), n= 兀 这样,也就完成了一个加窗。 但是,在实际的实践过程中,很少用矩形窗的。其原因是,矩形窗的阻带衰减不够,仅仅只 有21[dB]。于是,各种各样的窗口就被提出了。各有各的特点,在我们所学的初步的设计中,我们 就仅仅看阻带衰减就够」。各种窗函数的性能如下。 窗函数 过渡带大小 阻带衰减 矩形窗 1.8T/ 汉宁窗 2TT/N 汉明窗 OTT/N 布莱克曼窗 11T/N 用窗函数实现一个滤波器 以上说了很多有关于窗函数的原理,现在来整理一下设计的步骤。 1.根据设计的规格,参数要求,我们选择一个适合的窗函数。这里主要我们还是看阻带衰减 阻带衰减要人于给定的值。一般,若没有给定阻带衰减,我们则需要通过通带纹波和阻带纹波去求 polo 0 1+6 201og0 2.根据要求的通带边缘频率和阻带起始频率,计算过度区的大小,从而计算出窗函数的长度 3.最后,根据窗函数和理想滤波器的单位冲击响应,计算出我们所需要的滤波器的单位冲击响 现在,我们来实战一下,假设我们需要设计如下滤波器 1通带边缘频率0 2.通带纹波6.=0.1 3诵带起始频率C=[rad] 4.阻带纹波δ.=0.01 规格中,没有给定阻带哀减,我们只能自凵计算。 Rn=-20o1+6 =1.743[dB 6 A=-201og 10 =40828[dB] 1+ 这里,阻带衰减为 ,我们选择的窗的阻带衰减不能比这个小,这里其实汉宁窗就可 以做到。但我还是选择用汉明窗去做。然后,计算窗长度 兀兀亓 A的=0。-C 6666 N 396 △0 兀 窗长度有了,计算单位冲山响应吧 h(n)=hi(n)o(n) N-1N-1 sinc(-n).co(n),n 兀 兀 2π兀 (n)=0.54+046cos 这样,我们就得到了一个滤波器。下面是我们计算出来的这个滤波器的单位冲击响应。 :----+- 0.3…----1-1 02 0.1 写在最后的话 到此,我们设计出了一个滤波器,我们也顺利的得出了它的单位脉冲响应。 但是,滤波器真的可以实现么?真的可以设计出这样一个滤波器么? 我觉得要拿着这个单位脉冲响应结果,去实际计算一下,才能发现,这样的滤波器是实现不了 的!拿教科书上的话来说,这个滤波器是非因果的!这个问题的解决方法,和窗函数的 设计 代吗的实现在下一节数宇信号处理单位冲击响应的频响与的实现代码(语言) [数字信号处理]单位冲击响应与频响以及FR实现代码(C语言) 单位冲击响应与频响 就如同之前所说的一样,使用下图所示的单位冲击响应,所设计的滤波器,是无法实现的 04…1-1 03……:+4……: 0.1 hrte Tn 015-10 101520 Trme n 现在,让我们看看其这个滤波器的频响。所谓频响,就是计算其单位冲击响应的离散时间傅 里叶变换, H(e6)=∑h(m)e =h2(0)+∑h(2)e+e) h, (0)+22, (n)cos(an) n=1 我们可以看出,这个滤波器的频响的计算结果是实数,并没有虚数部分。也就是,其相位谱一 直是,也就意味着,这个滤波器输入与输岀之间没有延迟,这种相位特性称为延迟相位特性。 但是,这个滤波器无法是无法实现的。我们实际计算·下该滤波器的输入输山,就可以明白。 y()=2h(k)x(m-k) t=-20 y(0)=h2(-20x(20)+h2(19)x(19)+…+h2(20)x(-20) 这个滤波器在计算的过程中,需要过去的值和未来的值。未来的值是不可预测的,所以,这个 滤波器无法实现。为∫使得这个滤波器可以实现,我们只好移动其单位冲击响应,使待其不冉需要 未来的值。比如,就像卜面这样移动. 【实例截图】
【核心代码】
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论