社区
图形处理/算法
帖子详情
怎样得到频率 从已经进行fft变换后得到的复数中
张晓博
2005-12-06 04:46:49
请各位帮忙,谢谢了,一个最最基本的问题。
我通过fft变换得到了一个存储复数结构的数组或者链表,但是我n就没有动过数学了,不知道
怎样从一个复数的实部和虚部得到 其它的信息,例如:角速度,频率等等,因为我得到了频率才
可以进行滤波等操作,如果不知道这些计算出来的频率,当然就没办法滤了。
希望高手给与指教,当然也可以加上一些 滤波的教诲(除噪)。
...全文
168
回复
打赏
收藏
怎样得到频率 从已经进行fft变换后得到的复数中
请各位帮忙,谢谢了,一个最最基本的问题。 我通过fft变换得到了一个存储复数结构的数组或者链表,但是我n就没有动过数学了,不知道 怎样从一个复数的实部和虚部得到 其它的信息,例如:角速度,频率等等,因为我得到了频率才 可以进行滤波等操作,如果不知道这些计算出来的频率,当然就没办法滤了。 希望高手给与指教,当然也可以加上一些 滤波的教诲(除噪)。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
电子设计大赛,stm32+
fft
傅里叶
变换
FFT
是离散傅立叶
变换
的快速算法,可以将一个信号
变换
到频域。有些信号在时域上是很难看出什么特征的,但是如果
变换
到频域之后,就很容易看出特征了。这就是很多信号分析采用
FFT
变换
的原因。另外,
FFT
可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。 虽然很多人都知道
FFT
是什么,可以用来做什么,怎么去做,但是却不知道
FFT
之后的结果是什意思、如何决定要使用多少点来做
FFT
。 现在就根据实际经验来说说
FFT
结果的具体物理意义。一个模拟信号,经过ADC采样之后,就变成了数字信号。采样定理告诉我们,采样
频率
要大于信号
频率
的两倍。< 采样
得到
的数字信号,就可以做
FFT
变换
了。N个采样点,经过
FFT
之后,就可以
得到
N个点的
FFT
结果。为了方便
进行
FFT
运算,通常N取2的整数次方。假设采样
频率
为Fs,信号
频率
F,采样点数为N。那么
FFT
之后结果就是一个为N点的
复数
。 每一个点就对应着一个
频率
点。这个点的模值,就是该
频率
值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么
FFT
的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。而第一个点就是直流分
c语言实现
fft
(快速傅里叶
变换
)
1.
FFT
(Fast Fourier Transformation),即为快速傅里叶
变换
,是离散傅里叶
变换
的快速算法,它是根据离散傅里叶
变换
的奇、偶、虚、实等特性,对离散傅里叶
变换
的算法
进行
改进获得的。 2.
FFT
算法的基本原理
FFT
算法是把长序列的DFT逐次分解为较短序列的DFT。 按照抽取方式的不同可分为DIT-
FFT
(按时间抽取)和DIF-
FFT
(按
频率
抽取)算法。按蝶形运算的构成不同可分为基2,基4,基8,以及任意因子的类型。 3本次程序的基本过程 我们这次所研究的是数字信号处理
中
的
FFT
算法,我们这次所用的数字信号是
复数
类型的。 (1)所以首先,我们先定义了一个
复数
结构体,因为是
进行
复数
的运算,我们又相继定义
复数
的加减乘运算的函数。 (2)紧接着,我们定义了
进行
FFT
计算的
fft
()快速傅里叶
变换
函数initW() 初始化
变换
核函数即旋转因子的计算,change() 变址函数,output()输出傅里叶
变换
的结果的函数。 (3)定义主函数,并调用定义好的相关子函数,利用
fft
()
中
的蝶形运算以及change()函数来完成从时间域上选取的DIT-
FFT
。
可计算任意序列长度的高效精炼快速傅里叶
变换
算法
FFT
快速傅立叶算法,采用时域抽取法
FFT
(Decimation-In-Time
FFT
, 简称 DIT -
FFT
),完全采用标准C++语言编写,算法上采用了蝶形运算原理,数据结构采用 STL 模板库存储动态数组,采用 complex 类处理
复数
运算。代码简单,容易理解,只有输入,输出的vector 数组。总共 90 多行代码。不同于一般的
FFT
算法,本算法没有对输入序列作任何条件限制,可以是任意长度。调试
中
经测试,对一个2^19=52万左右个数据点的输入数组,算法在5秒时间可给出结果,输出结果是所有
频率
值的模值,而不是单独的实部与虚部(当然也可以单独给出实部虚部计算其相位)。
一种适用于CMMB 标准的新型
FFT
处理器设计
针对
中
国移动多媒体广播(CMMB)系统
中
高速
FFT
处理器的设计要求,提出了一 种新的适用4096 或2048 点
FFT
算法的实现结构。文
中
采用了混合基4/2、按
频率
抽取
FFT
算法,完成了4096/2048 点,13bit 位宽,定点
复数
FFT
的设计。基4 蝶形单元
中
采用13*10 的算术乘法器并使用6 级流水线设计,提高了
FFT
的处理速度。此外通过级与级之间的控 制能够采用同一套结构实现两个点数的
FFT
变换
,节约了资源。本设计将每一级划分为一 个功能模块,全部采用VerilogHDL 语言描述并通过FPGA 仿真验证。
FFT
算法分析实验实验报告.doc
一 实验目的 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
变换
,并通过分析其频谱图得知该未知信号
中
的
频率
分量。 五 基2
FFT
程序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
社区成员
50,698
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章