分段周期函数用matlab怎么进行分段函数傅里叶变换换或者FFT函数?比如这个。

关于matlab中FFT函数的一些讨论 - 通信技术你问我答 -
纯技术讨论者的天地 - Powered by C114
&问答管理员: &&
待解决问题
关于matlab中FFT函数的一些讨论&&
离问题结束还有0天0小时 &|&
提问时间: 21:25
关于FFT变换后X(K)序列的值,于对应的真实频谱幅度之间的关系。好容易在书上找到这么一小段话,再通过仿真验证,发现做FFT分析时,幅值大小与FFT选择的点数有关,一般来说,点数越多,对应的X(K)序列值越大。A:对于非周期信号用DFT计算非周期信号的傅氏变换时,用DFT计算所得的频谱分量乘以Ts, 就等于频谱的正常幅度电平;用IDFT计算非周期信号的傅氏反变换,再乘以fs就得到所需信号的正常幅度电平。所以,从时间到频率, 再从频率到时间,整个过程总共乘了Ts*fs=1。幅度电平未受到影响。B:对于周期信号用DFT计算周期信号的傅氏级数时,用DFT计算出的频谱分量乘以 1/N等于周期信号的频谱的正常幅度电平。而用IDFT的计算结果乘以N才等于周期信号。通过仿真,发现一个现象,比如说数据有效长度为NData, 做N点FFT变换。如果NData&&N, 即需要补N-NData个零才能做运算时,得到的频谱的振幅值为大幅减小。如果NData接近于N,即不需要补零,或者只需要补少量的0,频谱振幅值与真实值较为接近。一般来看,做完FFT,x(K)*2/N后,与真实的频谱振幅值相比,都要小一点,不知道是为什么。给原序列补0以后,相当于改变了原序列,可能会给原序列的频谱带来一些额外的频率成分。大牛们快来指点一下,这些现象背后的真正原因是什么?对fft不熟哇!
问题答案 (&7&条&)
补0为什么会改变原序列呢?没有数据的地方不是原本就相当于0吗?
给原序列补0后做FFT相当于在频率域做了过采样。如果按所有点的能量总和来计算,补0后,虽然幅度降低了,但能量总和是不变的。 在实际的工程实现中,都不是按书上写的办法做,无论IFFT还是FFT都乘以1/sqrt(N)的系数。
看过陈大侠的《深入浅出通信原理》关于DFT的一相章节后,我感觉可以这么解释这个问题。所谓对一个序列做DFT,其物理意义的本质是对一个序列进行周期扩展,扩展成周期信号号,再求该离散周期信号的傅里叶系数。当然,该系数也是离散而周期的,取其主值区间,就是X(k)。
那么,如果对一个序列补0,相当于将一个信号后面加了多个零,然后再对这个新的“0拖尾”信号进行周期扩展。这个新的信号的频谱当然不同于原信号。
所以,这也就解释了为什么补零后,原信号的频谱会变的原因。
工程与理论确实有很大差距啊。问题是只思考理论问题的话,怎么也想得不太深入,如果有切实要解决的问题才能促进人进行深入思考。这也是为什么工程技术人员对某些细节特别熟悉的原因吧。
朋友说工程上做IFFT和FFT都会乘以sqrt(N),很奇妙。
在工程实现中,FFT和IFFT采用的是相同的电路或代码,只是配置参数不同而已。如果分别采用1/N或1为系数,也无法用。重点是,在数字实现时,主要都是整数定点实现的,只有数值的动态范围,基本上已经没有数值绝对大小的概念了。
我今天才想明白,如果正负变换都乘以1/sqrt(N),那么两次变换都成为酉变换,即一个序列的能量可以保持不变。如果书上的理论也全按这样来定义,那么帕斯瓦尔定理中,频域前面乘的1/N也可以去掉了,形式更简洁。
我要回答:&
回答字数在10000字以内查看: 5643|回复: 6|关注: 0
如何使用MATLAB中的fft函数来进行频谱分析?
本帖最后由 angelstear 于
21:44 编辑
我不是学通信的,但需要用频谱分析,所以从网上各种搜刮,自己写了一个代码,但不知是否正确、存在什么问题,请大家帮忙建议、改正,多谢了!我使用的是win7 64bit,MATLAB 2010a
比如一个1×n的向量x,采样频率为fs
首先,预处理一下x,以便更好的使用快速傅里叶变换(FFT)x=x-mean(x);
y=detrend(x);复制代码接下来做FFTY=fft(y,length(y));复制代码然后做频谱图amp=abs(Y);
n=0:(length(y)-1);
f=n*fs/length(y);& &
plot(f(1:length(y)/2),amp(1:length(y)/2))复制代码在得到的图中观察峰值所对应的横坐标,即为x的频率。
希望诸位多提意见,在此先行谢过!
关注者: 142
|此回复为最佳答案
多谢!对于入门帮助很大!
能给我解释一下你这个程序的最后一行里面的参数怎么设置的么?谢谢。。新手上任,正好在做这个。。
张玉静 发表于
能给我解释一下你这个程序的最后一行里面的参数怎么设置的么?谢谢。。新手上任,正好在做这个。。 ...
这个也是从网上搜刮来的。是因为如果plot全部的话会发现它是一个关于x=(max(x)-min(x))/2对称的一个分布,所以只取一半。
不知我有没有理解对您的意思,有问题的话我们再沟通:)
因为对于大多数实信号来说,正负频率是对称的,所以fft计算频谱后,实际是计算了在一个周期内的谱,而习惯上是只要在[0,Ts/2]观察就可以了,俗称单功率谱或者单边频谱,因此程序就取2了。你自己也可以全部取,注意x向量同样对应长度就可以了。
补充下:这里说的大部分实信号是正负频谱对称不是说还有小部分实信号不满足,而是说所有实信号都是满足的。部分是针对复信号来说的
站长推荐 /1
Powered byMATLAB的连续时间傅里叶变换_百度知道
MATLAB的连续时间傅里叶变换
x订叮斥顾俪该筹双船晶=sin(pi*t)/(pi*t);h=cos(100*pi*t);y=x+h;z=y+0.5*y^2;相对Z进行傅里叶变换,怎么用FFT函数实现????不用fourier函数
提问者采纳
clear allt=0:0.001:1;%设定信号时间为0到1秒,采样频率为1000HZx=sin(pi*t)./(pi*t+eps);%信号1h=cos(100*pi*t);%信号2y=x+h;%叠加信号z=y+0.5*y.^2;%叠加信号的信号Z=fft(z);%FFTPzz=Z.*conj(Z)/1000;%信号功率谱f=)/1000;%计算横轴频率值figure(1)plot(t,z),title('信号z'),xlabel('时间(S)')&figure(2)subplot(2,1,1),plot(f,abs(Z(1:500))),title('信号z幅值谱'),xlabel('频率(Hz)')subplot(2,1,2),plot(f,Pzz(1:500)),title('信号z功率谱'),xlabel('频率(Hz)')&figure(3)%更清楚的表示,将横轴范围缩小subplot(2,1,1),plot(f,abs(Z(1:500))),axis([-5,150,0,1200]),title('信号z幅值谱'),xlabel('频率(Hz)')subplot(2,1,2),plot(f,Pzz(1:500)),axis([-5,150,0,1200]),title('信号z功率谱'),xlabel('频率(Hz)')&&
FFT函数到底怎么用。我看其他人说FFT是离散时间的傅立叶变换呢
fft是离散时间傅立叶变换的快速算法函数,计算机做不了连续时间的问题,应用中也没人用连续时间的傅氏变换,那是数学研究,没有办法实现的数学概念罢了,
提问者评价
很不错的答案和讲解,一下子就懂了
其他类似问题
为您推荐:
傅里叶变换的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 分段fft 的文章

 

随机推荐