fftshift的作用正是让正半轴部分和负半轴部分的图像分别关于各自的中心对称。因为直接用fft得出的数据与频率不是对应的,fftshift可以纠正过来。
假设f(x,y)是一个离散空间中的二维函数,则该函数的二维傅立叶变换的定义如下:
p=0,1…M-1 q=0,1…N-1 (1)
或 p=0,1…M-1 q=0,1…N-1 (2)
离散傅立叶反变换的定义如下:
m=0,1…M-1 n=0,1…N-1(3)
F(p,q)称为f(m,n)的离散傅立叶变换系数。这个式子表明,函数f(m,n)可以用无数个不同频率的复指数信号和表示,而在频率(w1,w2)处的复指数信号的幅度和相位是F(w1,w2)。
2、MATLAB提供的快速傅立叶变换函数
(1)fft2
fft2函数用于计算二维快速傅立蠢备叶变换,其语法格式为:
B = fft2(I)
B = fft2(I)返回图象I的二维fft变换矩阵,输入图象I和输出图象B大小相同。
例如,计算图象的二维傅立叶变换,并显示其幅值的结果,如图所示,其命令格式如下
load imdemos saturn2
imshow(saturn2)
B = fftshift(fft2(saturn2))
imshow(log(abs(B)),[],'notruesize')
(2)fftshift
MATLAB提供的fftshift函数用于将变换后的图象频谱中心从矩阵的原点移到矩阵的中心,其语法格式为:
B = fftshift(I)
对于矩阵I,B = fftshift(I)将I的一、三象限和二、四象限进行互换。
(2)ifft2
ifft2函数用于计算图象的二维傅立叶反变换,其语法格睁缺式为:
B = ifft2(I)
B = ifft2(A)返回图象I的二维傅立叶反变换矩阵,输入图象I和输出图象B大小相同。其语法格式含义与fft2函数的语法格式相同,可以参考fft2函数的说明。
如果信号是二维的,用上面的函数即可!直接调用。
如果信号是一维的,给你下面的例子带早毁,你应该能明白!
clear
fs=100N=128 %采样频率和数据点数
n=0:N-1t=n/fs %时间序列
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t)%信号
y=fft(x,N) %对信号进行快速Fourier变换,逆变换函数为ifft
mag=abs(y)%求得Fourier变换后的振幅
f=n*fs/N %频率序列
subplot(2,2,1),plot(f,mag) %绘出随频率变化的振幅
xlabel('频率/Hz')
ylabel('振幅')title('N=128')grid on
subplot(2,2,2),plot(f(1:N/2),mag(1:N/2))%绘出Nyquist频率之前随频率变化的振幅
xlabel('频率/Hz')
ylabel('振幅')title('N=128')grid on
%对信号采样数据为1024点的处理
fs=100N=1024n=0:N-1t=n/fs
x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t)%信号
y=fft(x,N) %对信号进行快速Fourier变换
mag=abs(y) %求取Fourier变换的振幅
f=n*fs/N
subplot(2,2,3),plot(f,mag)%绘出随频率变化的振幅
xlabel('频率/Hz')
ylabel('振幅')title('N=1024')grid on
subplot(2,2,4)
plot(f(1:N/2),mag(1:N/2))%绘出Nyquist频率之前随频率变化的振幅
xlabel('频率/Hz')
ylabel('振幅')title('N=1024')grid on
我看兄台写的代码还是很专业的迟明,我只回答第三问:窗函数肯定是不能任意选择的,加窗的意义在于减小频谱能量泄露,因为做傅里叶变换时只取信号的一段作分析,相当于将信号截断,在截段处引入了多余的高频分量,行绝所以窗函数一般在两端是呈衰减的趋势,其次窗码带告函数本身的频谱要比较平滑,不能对原信号的频谱带来太大影响,所以窗函数不能是任意的数字窗。matlab自带了短时傅里叶变换的分析函数,老版本的matlab是specgram函数,新的改成了spectrogram函数,虽然一说到时频分析,都会说到小波分析,小波分析要比短时傅里叶要好云云,但在分析信号的瞬时频谱时,短时傅里叶还是有它的用武之地的。前一阵也看了一些有关小波分析的matlab实现,发现帮助中使用小波也多是除噪、压缩,都说小波是时频显微镜,它的用武之地还是在于查看高频在哪一级分解中,进而可以有效滤除一些信号,比如除噪,所以短时傅里叶变换查看瞬时频率正好互补一下。时频分析还认识的不深,一个阶段的想法而已。另外,之前对matlab的扫频函数chirp做过总结,见http://blog.sina.com.cn/s/blog_6163bdeb0100qbqo.html,里面就是使用spectrogram函数来查看产生的扫频信号的瞬时频率的,当时不知道那个函数是干啥,就感觉好神奇,现在正好看到,总结一下吧!
spectrogram
功能:使用短时傅里叶变换得到信号的频谱图。
语法:
[S,F,T,P]=spectrogram(x,window,noverlap,nfft,fs)
[S,F,T,P]=spectrogram(x,window,noverlap,F,fs)
说明:当使用时无输出参数,会自动绘制频谱图;有输出参数,则会返回输入信号的短时傅里叶变
换。当然也可以从函数的返回值S,F,T,P绘制频谱图,具体参见例子。
参数:
x---输入信号的向量。默认情况下,即没有后续输入参数,x将被分成8段分别做变换处理,
如果x不能被平分成8段,则会做截断处理。默认情况下,其他参数的默认值为
window---窗函数,默认为nfft长度的海明窗Hamming
noverlap---每一段的重叠样本数,默认值是在各段之间产生50%的重叠
nfft---做FFT变换的长度,默认为256和大于每段长度的最小2次幂之间的最大值。
另外,此参数除了使用一个常量外,还可以指定一个频率向量F
fs---采样频率,默认值归一化频率
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)