FFT算法分析实验实验报告.doc
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
一 实验目的 1) 掌握用DSP芯片对信号进行频谱分析的操作方法。 2) 了解DSP进行FFT运算的算法及程序。 二 实验原理 试验箱上的信源可以产生两个不同频率的正弦信号的叠加信号,将该信号用ADC进行 采样,并将采集结果送入DSP芯片进行FFT运算,将结果以图的形式显示在电脑上,可分 析出输入信号中有哪些频率分量。实际试验前可运用Matlab进行理论分析,便于与分析 实验结果。 从FFT结果图中计算信号的频率分量:N点FFT的结果是N个复数,假设采样频率为Fs(程 序中为16000Hz),采样点数为N(程序中为128),做FFT之后,某一点n(n从0开始)表示 的频率为:Fn=n*Fs/N;该点的模值除以N/2就是对应该频率下的信号的幅度(对于直流 信号是除以 N)。 程序运行后,第48个点附近FFT的模值不为0,对应频率为48*16000/128=6000,用该模 值除以128/2,即64,约为1,就是叠加信号中该频率成份的幅值。 Matlab程序代码: close all; Adc = 0; % 直流分量幅度 A1 = 1; % 频率F1信号的幅度 A2 = 1; % 频率F2信号的幅度 F1 = 100; % 信号1频率(Hz) F2 = 6000; % 信号2频率(Hz) P1 = 0; % 信号1相位(度) P2 = 0; % 信号2相位(度) Fs = 16000; % 采样频率(Hz) N = 128; %采样点数 t = [ 0 : 1/Fs : N/Fs ]; %采样时刻 %原始叠加信号 S = Adc + A1*sin(2*pi*F1*t + pi*P1/180) + A2*sin(2*pi*F2*t + pi*P2/180); %显示原始信号 plot(S); title('原始信号'); figure; Y = fft( S, N ); %做FFT变换 Ayy = ( abs( Y ) ); %取模 plot( Ayy(1:N) ); %显示原始的FFT模值结果 title( 'FFT 模值' ); figure; Ayy = Ayy/(N/2); %换算成实际的幅度 Ayy(1)=Ayy(1)/2; % 直流分量的幅值单独处理 F=([1:N]-1)*Fs/N; %换算成实际的频率值 plot(F(1:N/2),Ayy(1:N/2)); %显示换算后的FFT模值结果 title('幅度-频率曲线图'); 三 实验结果及分析 利用示波器观察信源信号调整为:信号1频率500Hz,信号2频率5010Hz,峰峰值均为5V。 运行Matlab程序得到如图1所示: 图1 Matlab仿真产生的信号波形图 实际实验结果: 由图可知,第4个点和第40个点附近FFT值不为零。代入公式N*16000/128可得, 图2 实际测试实验结果 测试的实验结果为:在第4点和第40点。 f1=4*16000/128=500Hz,f2=40*16000/128=5000Hz。 误差分析: 高频信号实验值为5000Hz,与设计值5010Hz存在一定误差。引起误差的原因是,本次 实验做的事128点的FFT,相当于对频域的抽样,故只能表示FFT整数点上对应的频率。而 5010Hz对应的FFt点为40.08,实验中无法取得该值,故出现了误差。对于低频信号,其 对应FFT值恰好位于整数位置上,故无误差出现。 对于FFT参数的选择:若要获得更加精确的频率值,则应该适当增加FFT点数。若要获得 更大频率范围的测量结果,应增大ADC的采样频率。 四 实验总结 可以利用DSP芯片对位置信号做FFT变换,并通过分析其频谱图得知该未知信号中的频率 分量。 五 基2FFT程序C函数设计 #include<complex.h> int fft(complex *a,int l) { const double pai=3.141592553589793; complex u,w,m; unsigned n=1,nv2,nm1,k,le,lei,ip; unsigned i,j,m; double tmp; n<<=1; nv2=n>>=1; nm1=n-1; i=0; for(i=0;i<nm1;i++) { if(i<j) { t=a[j] a[j]=a[i]; a[i]=t; } k=nv2; while(k<=j) { j-=k; k>>=1; } j+=k } le=1 for(m=1;m<=1;m++) { lei=le le<<=1; u=complex(1,0); tmp=pai/lei; w=complex(cos(tmp),-sin(tmp)); for(j=0;j<lei;j++) { for(i=j;i<n;i+=le) { ip=i FFT(快速傅里叶变换)是一种高效的离散傅里叶变换(DFT)算法,用于计算有限序列的离散傅里叶变换。本实验旨在让学生掌握如何使用DSP(数字信号处理器)芯片对信号进行频谱分析,理解并实现FFT运算的算法及程序。 实验原理基于以下几点: 1. 信号产生:实验箱上的信源能生成两个不同频率的正弦信号叠加,通过ADC(模数转换器)进行采样。 2. FFT计算:将采样结果输入到DSP芯片,执行FFT运算,得出的复数结果代表了信号在频域的分布。频率计算公式为Fn=n*Fs/N,其中Fn是频率,n是FFT结果的索引(从0开始),Fs是采样频率,N是采样点数。 3. 幅度计算:FFT结果的模值除以N/2可得到对应频率下的信号幅度。对于直流信号,需除以N。 在Matlab中,通过编写程序模拟信号生成,执行FFT运算,并将结果进行可视化。程序中设置了不同的信号参数,例如采样频率Fs=16000Hz,采样点数N=128。通过对原始信号进行FFT变换,然后取模值并换算成实际频率,可以看到不同频率分量。 实验结果显示,在4点和40点附近有非零的FFT值。根据频率计算公式,可以得出f1=500Hz和f2=5000Hz。然而,与设计值相比,f2存在一定的误差,这主要是由于128点的FFT只能精确表示整数点上的频率,5010Hz对应的是40.08点,因此产生了误差。为了提高频率精度,可以增加FFT点数;若要扩大频率范围,需要提高ADC的采样频率。 实验总结表明,DSP芯片可以有效地执行FFT变换,从而分析未知信号的频率成分。通过实验,学生能够理解FFT在信号处理中的应用,以及参数选择对结果精度的影响。此外,实验还涉及了误差分析,帮助学生理解实际操作与理论计算之间的差异。 基2 FFT算法的C函数设计通常包括复数操作、位反转、蝶形运算等核心步骤。在给出的实验报告中,虽然没有提供完整的C函数,但可以看出该函数将实现类似的功能,如初始化、数据排列、复数乘法和加法等,以完成FFT计算。这样的函数设计对于实际的信号处理软件和硬件系统具有重要的意义,因为它能高效地处理大量数据,广泛应用于通信、图像处理、音频分析等领域。
- 粉丝: 192
- 资源: 3万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助