离散傅里叶变换(DFT):
快速傅里叶变换(FFT)是一种运用蝶形算子计算DFT的方法。
下面是matlab实现代码:
close all; clear;
fs=200;
N=256; %采样freq和数据点数
n=0:N-1;
t=n/fs; %时间序列
% x=0.5*sin(2*pi*15*t); %+2*sin(2*pi*40*t); %实信号
x=4*exp(j*2*pi*15*t)% +2*exp(-j*2*pi*40*t) + 2 + 4*i; %+ 4000+4000*i; %复数信号
y1=fft(x,N); %对信号进行快速Fourier变换
y2=fftshift(y1);
x_ifft1 = ifft(y1);
x_ifft2 = ifft(y2);
mag1=abs(y1); %求得Fourier变换后的amplitude
mag2=abs(y2);
f1=n*fs/N; %freq序列
f2=n*fs/N-fs/2;
subplot(4,1,1),plot(t,abs(x),'b'); %绘出随freq变化的amplitude
xlabel('time/s');
ylabel('amplitude');title('Figure1: time domain signal','color','b');grid on;
subplot(4,1,2),plot(f1,mag1,'b'); %绘出随freq变化的amplitude
xlabel('freq/Hz');
ylabel('amplitude');title('Figure2: usual FFT','color','b');grid on;
subplot(4,1,3),plot(f2,mag1,'b'); %绘出随freq变化的amplitude
xlabel('freq/Hz');
ylabel('amplitude');title('Figure3: FFT without fftshift','color','b');grid on;
subplot(4,1,4),plot(f2,mag2,'b'); %绘出随freq变化的amplitude
xlabel('freq/Hz');
ylabel('amplitude');title('Figure4: FFT after fftshift','color','b');grid on;
图中,信号由三个信号叠加起来, 15Hz的信号, -40Hz的信号,(2+4i)的直流分量。
Question 1) 如何理解负频率信号?频率不都应该是正的吗?
频率,原始定义是机械1秒内运动的次数。然而,到了二维平面,它的定义就扩充了,不再局限,而是用来描述旋转的快慢。这里就有了角频率,Ω=2πf,rad/s。既然是旋转,那么就有逆时针旋转和顺时针旋转,以逆时针旋转频率为正,那么顺时针旋转频率就为负频率了。因此,傅里叶变换中,负频率是有物理意义的,不是只有数学意义的东西。
2)为什么实数信号做完fft之后在正负频率轴各有一个峰值,而复数信号只有一个呢?
复信号fft推导:
实信号推导:
3. fftshift的作用?
fftshift移动零频点到频谱中间,重新排列fft,fft2和fftn的输出结果。将零频点放到频谱的中间对于观察傅立叶变换是有用的。图3和图4对比发现, 做完fftshift之后,很容易看到-40Hz和15Hz的波峰。
注意,如果想恢复时域信号,这必须是没有做fftshift的值,做fftshift只为便于观察频谱。
4)如果给输入信号加一个相位呢?怎么求这个相位?
实数相位可以用atan2(b, a)来求,复数相位??????
总结:
假设采样频率为Fs,采样点数为N,做FFT之后,某一点n(n从1开始)表示的频率为:Fn=(n-1)*Fs/N;该点的模值除以N/2就是对应该频率下的信号的幅度(对于直流信号是除以N);该点的相位即是对应该频率下的信号的相位。相位的计算可用函数atan2(b,a)计算。atan2(b,a)是求坐标为(a,b)点的角度值,范围从-pi到pi。要精确到xHz,则需要采样长度为1/x秒的信号,并做FFT。要提高频率分辨率,就需要增加采样点数,这在一些实际的应用中是不现实的,需要在较短的时间内完成分析。解决这个问题的方法有频率细分法,比较简单的方法是采样比较短时间的信号,然后在后面补充一定数量的0,使其长度达到需要的点数,再做FFT,这在一定程度上能够提高频率分辨力。
IDFT变换:
LTE 信号:
LTE信号,先不考虑NCP 的情况,