MATLAB中的fft后为何要用fftshift?

来源:学生作业帮助网 编辑:作业帮 时间:2024/11/07 13:54:11

MATLAB中的fft后为何要用fftshift?
MATLAB中的fft后为何要用fftshift?

MATLAB中的fft后为何要用fftshift?
即对频域的图像,(假设用一条水平线和一条垂直线将频谱图分成四块)对这四块进行对角线的交换与反对角线的交换FFTSHIFT Shift zero-frequency component to center of spectrum.
For vectors, FFTSHIFT(X) swaps(交换) the left and right halves of
X. For matrices, FFTSHIFT(X) swaps the first and third
quadrants and the second and fourth quadrants. For N-D
arrays, FFTSHIFT(X) swaps "half-spaces" of X along eachdimension.
FFTSHIFT(X,DIM) applies the FFTSHIFT operation along the
dimension DIM.
FFTSHIFT is useful for visualizing the Fourier transform with
the zero-frequency component in the middle of the spectrum.fftshift就是对换数据的左右两边比如
x=[1 2 3 4]
fftshift(x) ->[3 4 1 2]
IFFTSHIFT Inverse FFT shift.(就是fftshift的逆)x=[1 2 3 4 5];y=fftshift(x)y = 4 5 1 2 3ifftshift(y)ans = 1 2 3 4 5
IFFTSHIFT undoes the effects of FFTSHIFT. 注意:在使用matlab的fft及fftshift时,应注意.假定采样频率fs,采样间隔dt,采样点数N.fftshift后的频率为-2,-1,0,1,2对于二维fftshift,其与直接用下面的结果一样if mod(tempN,2)==0 kx=(0:tempM-1)/tempM/dx-tempM/2/tempM/dx;% kx=kx*2*pielse kx=(0:tempM-1)/tempM/dx-(tempM-1)/2/tempM/dx;% kx=kx*2*piendkx=kx*2*pi;if mod(tempM,2)==0 ky=(0:tempN-1)/tempN/dy-tempN/2/tempN/dy;% kx=kx*2*pielse ky=(0:tempN-1)/tempN/dy-(tempN-1)/2/tempN/dy;% kx=kx*2*piendky=ky*2*pi;temp1=sqrt(kx.^2+ky.^2);k1=temp1;[kx,ky]=meshgrid(kx,ky);如下面程序表明上面两个相同:dx=50e3; dy=50e3;% % % % % % % % % % % tempN=41;tempM=41;% % % % % % % % % % % % % % % %determining the wavenumber kx and kyif mod(tempM,2)==0 kx=(0:tempM-1)-tempM/2;% kx=kx*2*pielse kx=(0:tempM-1)-(tempM-1)/2;% kx=kx*2*piendkx=kx*2*pi/tempM/dx;if mod(tempN,2)==0 ky=(0:tempN-1)-tempN/2;% kx=kx*2*pielse ky=(0:tempN-1)-(tempN-1)/2;% kx=kx*2*piendky=ky*2*pi/tempN/dy;[kxx,kyy]=meshgrid(kx,ky);k00=sqrt(kx.^2+ky.^2);% % % % % % % % % % % % % % % % if mod(tempM,2)==0 temp1=tempM/2-1; temp2=(temp1+1):(tempM-1); temp2=temp2-tempM; temp3=[0:temp1,temp2]; kx=temp3/tempM/dx;% kx=kx*2*pielse temp1=(tempM-1)/2; temp2=(temp1+1):(tempM-1); temp2=temp2-tempM; temp3=[0:temp1,temp2]; kx=temp3/tempM/dx;% kx=kx*2*piendkx=kx*2*pi;if mod(tempN,2)==0 temp1=tempN/2-1; temp2=(temp1+1):(tempN-1); temp2=temp2-tempN; temp3=[0:temp1,temp2]; ky=temp3/tempN/dy;% kx=kx*2*pielse temp1=(tempN-1)/2; temp2=(temp1+1):(tempN-1); temp2=temp2-tempN; temp3=[0:temp1,temp2]; ky=temp3/tempN/dy;% kx=kx*2*piendky=ky*2*pi;[kx,ky]=meshgrid(kx,ky);kx=fftshift(kx);ky=fftshift(ky);k=sqrt(kx.^2+ky.^2);figuresubplot(3,1,1),contourf(kxx-kx)subplot(3,1,2),contourf(kyy-ky)subplot(3,1,3),contourf(k00-k)%%%%%%%%%%%fft及fftshift示例:
clf;fs=100;N=256; %采样频率和数据点数n=0:N-1;t=n/fs; %时间序列x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信号y1=fft(x,N); %对信号进行快速Fourier变换y2=fftshift(y1);mag1=abs(y1); %求得Fourier变换后的振幅mag2=abs(y2); f1=n*fs/N; %频率序列f2=n*fs/N-fs/2;%这个未必正确subplot(3,1,1),plot(f1,mag1,'r'); %绘出随频率变化的振幅xlabel('频率/Hz');ylabel('振幅');title('图1:usual FFT','color','r');grid on;subplot(3,1,2),plot(f2,mag1,'b'); %绘出随频率变化的振幅xlabel('频率/Hz');ylabel('振幅');title('图2:FFT without fftshift','color','b');grid on;subplot(3,1,3),plot(f2,mag2,'c'); %绘出随频率变化的振幅xlabel('频率/Hz');ylabel('振幅');title('图3:FFT after fftshift','color','c');grid on;

MATLAB中的fft后为何要用fftshift? MATLAB中的fft后为何要用fftshift? MATLAB中的fft后为何要用fftshift? matlab中fft命令为何要配合fftshift来用?如题. matlab怎么用fft计算dct 为什么用matlab将两个信号叠加后,再进行FFT后的图像和分别FFT的图像叠加的不同?(图像是功率频谱图) matlab中fft变换出来后频率的数值不合理,这个声波数据是环境中的背景噪声波,采样频率是2wHz,得到的数据记录为两列,分别是时间t和幅度y1.用fft变换后求频率.程序如下,问题是我把程序里面的 matlab 如何进行复数的 fft运算我是想读取外部txt中的128个16进制数据(实部和虚部分别有128个)让后对128个点进行fft计算 matlab怎么用 fft画语音信号频谱图 如何用matlab实现fft不是用matlab自带的函数fft,而是自己重新编程 fft的输出为何不是一条线?本来,fft是对信号进行傅立叶变换,可以得到原有信号的频率成分的.可是在用matlab实行fft的时候,(估计其它语言也一样)即使对一个单纯的正弦波,它的输出也并非是 为什么用matlab里的FFT对一个记录下来的波形(列向量)进行分析,采样频率不同,经过FFT后的最大幅值对应的频率值不同. 求matlab的fft源程序 matlab FFT变换后 plot(f,2*abs(Y)/length(Y)) 为何要乘以2除以Y的长度才能得到正确的幅值呢?Fs = 1000; % 采样频率 T = 1/Fs; % 采样时间 L = 1000; % 总的采样点数 用MATLAB算[5 5]的FFT为[10 0]怎么算的?>>fft([5 5])ans = 10 0 matlab fourier()怎么用?与fft()函数的区别是什么?最好举个例子,比如门信号的,还有变换后怎么画出幅频图和相频图? FFT中的“相关”是什么意思? matlab中的fft使用疑问一般的用FFT进行频谱分析都是这么做的:fs=100; %设定采样频率N=128; % 设定FFT变换长度f0=10; %设定正弦信号频率x=sin(2*pi*f0*t);