
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进行傅里叶变换用fft()函数来变换,其逆变换用ifft()函数来变换。变换要求X为向量,而不是变量。
根据题主的代码应这样来处理。
>>t=-pi:pi/100:pi
>>x=sin(2*pi*t)
>>y=fft(x) %傅里叶变换
>>plot(abs(y))
x=ifft(y)%傅里叶逆变换
>>plot(t,x)
如果要使用Matlab进行频率偏移的仿真,需要完成以下几个步骤:1. 使用Matlab自带的函数生成被偏移频率信号。可以使用sin或者cos函数,或者基于一组已知数据进行处理,也可以用函数rand生成随机信号等。
2. 在采样点之间使用函数周期曲线回复技术恢复出被偏移频率的信号,其中周期曲线的拟合过程可以使用matlab的polyfit函数实现和绘制。
3. 对恢复出的被偏移频率信号进行信息提取处理,也可以使用Matlab进行实现,比如可以使用matlab的fft()函数对被偏移频率信号进行频谱分析,以确定各个频率的大小和发生的情况。
4. 在确定了信号频率偏移变化情况后,可以使用matlab的polyval()函数获得插值后的信号,在此基础上,可以对信号做额外的 *** 作以使数据更加精确等。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)