c语言fft便于移植.docx
- 文档编号:8649518
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:14
- 大小:2.44MB
c语言fft便于移植.docx
《c语言fft便于移植.docx》由会员分享,可在线阅读,更多相关《c语言fft便于移植.docx(14页珍藏版)》请在冰豆网上搜索。
c语言fft便于移植
实验一用FFT对信号作频谱分析
1.实验目的
学习用FFT对连续信号和时域离散信号进行谱分析的方法,了解可能出现的分析误差及其原因,以便正确应用FFT。
2.实验原理
用FFT对信号作频谱分析是学习数字信号处理的重要内容。
经常需要进行谱分析的信号是模拟信号和时域离散信号。
对信号进行谱分析的重要问题是频谱分辨率D和分析误差。
频谱分辨率直接和FFT的变换区间N有关,因为FFT能够实现的频率分辨率是
,因此要求
。
可以根据此式选择FFT的变换区间N。
误差主要来自于用FFT作频谱分析时,得到的是离散谱,而信号(周期信号除外)是连续谱,只有当N较大时离散谱的包络才能逼近于连续谱,因此N要适当选择大一些。
周期信号的频谱是离散谱,只有用整数倍周期的长度作FFT,得到的离散谱才能代表周期信号的频谱。
如果不知道信号周期,可以尽量选择信号的观察时间长一些。
对模拟信号进行谱分析时,首先要按照采样定理将其变成时域离散信号。
如果是模拟周期信号,也应该选取整数倍周期的长度,经过采样后形成周期序列,按照周期序列的谱分析进行。
3.实验步骤及内容
(1)对以下序列进行谱分析。
选择FFT的变换区间N为8和16两种情况进行频谱分析。
分别打印其幅频特性曲线。
并进行对比、分析和讨论。
(2)对以下周期序列进行谱分析。
选择FFT的变换区间N为8和16两种情况分别对以上序列进行频谱分析。
分别打印其幅频特性曲线。
并进行对比、分析和讨论。
(3)对模拟周期信号进行谱分析
选择采样频率
,变换区间N=16,32,64三种情况进行谱分析。
分别打印其幅频特性,并进行分析和讨论。
4.实验编写C语言程序清单
#include"stdio.h"
#include"conio.h"
#include"stdio.h"
#include"conio.h"
#include"math.h"
#definepi3.1415926
floata[128][2],b[128][2];
intmwdz(intN,intx)
{
inti,j,m,a[128],b[128],g,js;
for(i=0;i<128;i++)
{a[i]=0;
b[i]=0;}
js=jishu(N-1);
for(i=0;i<128;i++)
{if(i==0)
{a[i]=x%2;
b[i]=x/2;
}
else
{
b[i]=b[i-1]/2;
a[i]=b[i-1]%2;
}
if(b[i]==0)
break;
}
m=0;g=1;
for(i=0;i<128;i++)
{
for(j=i+1,g=1;j g=g*2; if(i>=js) g=1; m=m+a[i]*g; } returnm; } intjishu(intn) {inti,m; m=1; if(n==2) {m=2; } for(i=0;i if(pow(2,i)<=n&&n {m=i+1; break; } returnm; } main() { intN1,i,j,m,mi,js,r,r1; floati1,rcf[128],icf[128],tr[2],ti[2],yx[128]; floatbl[128]; printf("请输入FFT变换区间长度\n"); scanf("%d",&N1); js=jishu(N1-1); printf("级数js=%d\n",js); for(i=0;i<64;i++)/*实现待变换数据的输入,可根据变换区间长度补0值*/ a[i][0]=cos((pi/8)*i)+cos((pi/4)*i)+cos((5*pi/16)*i);/*此处以 的64点FFT为例*/ for(r1=0,i1=0.0;r1 { i1=2*pi*r1/N1; rcf[r1]=cos(i1); icf[r1]=-1*sin(i1); } for(i=0;i { j=mwdz(N1,i); a[j][1]=a[i][0]; b[j][1]=0; } r=pow(2,js); for(m=0;m { mi=pow(2,m); r=r/2; for(i=0;i { for(j=0;j { tr[0]=a[i+j][1]+rcf[r*j]*a[i+j+mi][1]-icf[r*j]*b[i+j+mi][1]; tr[1]=a[i+j][1]-rcf[r*j]*a[i+j+mi][1]+icf[r*j]*b[i+j+mi][1]; ti[0]=b[i+j][1]+rcf[r*j]*b[i+j+mi][1]+icf[r*j]*a[i+j+mi][1]; ti[1]=b[i+j][1]-rcf[r*j]*b[i+j+mi][1]-icf[r*j]*a[i+j+mi][1]; a[i+j][1]=tr[0];a[i+j+mi][1]=tr[1]; b[i+j][1]=ti[0];b[i+j+mi][1]=ti[1]; } } } for(i=0;i<64;i++) { yx[i]=sqrt(pow(a[i][1],2)+pow(b[i][1],2)); if(i>0) bl[i-1]=yx[i]/yx[0]; } for(i=0;i<64;i++)/*实现 的64点FFT变换结果的输出*/ printf("变换结果%lf+i(%lf)模为%lf\n",a[i][1],b[i][1],yx[i]); getch(); } 5.实验结果 根据不同的待变换数据和变换区间长度,分别对以上C程序的数据输入和变换结果输出部分进行修改,并利用所得实验数据借用matlab工具画出FFT的频谱图。 所得实验结果数据和频谱图如下: 图1 的8点和16点FFT变换结果 图2 的8点和16点FFT变换结果 图3 的8点和16点FFT变换结果 图4 的8点和16点FFT变换结果 图5 的8点和16点FFT变换结果 截取40个变换结果 图6 的16点、32点、64点FFT变换结果 6.思考题 (1)对于周期序列,如果周期不知道,如何用FFT进行谱分析? 如果不知道信号周期,可以尽量选择信号观察的时间长一些。 (2)如何选择FFT的变换区间? (包括非周期信号和周期信号) 对信号进行谱分析的重要问题是频谱分辨率D和分析误差。 频谱分辨率直接和FFT的变换区间N有关,因为FFT能够实现的频率分辨率是 ,因此要求 。 可以根据此式选择FFT的变换区间N。 (3)当N=8时, 和 的幅频特性会相同吗? 为什么? N=16呢? 因为 ,所以, 和 的8点DFT的模相等,但是,当N=16时, 和 不满足循环移位关系,所以模不同,幅频特性也就不同。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 fft 便于 移植
![提示](https://static.bdocx.com/images/bang_tan.gif)