怎样得到频率 从已经进行fft变换后得到的复数中

张晓博 2005-12-06 04:46:49
请各位帮忙,谢谢了,一个最最基本的问题。
我通过fft变换得到了一个存储复数结构的数组或者链表,但是我n就没有动过数学了,不知道
怎样从一个复数的实部和虚部得到 其它的信息,例如:角速度,频率等等,因为我得到了频率才
可以进行滤波等操作,如果不知道这些计算出来的频率,当然就没办法滤了。
希望高手给与指教,当然也可以加上一些 滤波的教诲(除噪)。
...全文
168 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
一 实验目的 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 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>=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

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧