在 MATLAB 中执行 FFT 后的高频杂散
High-frequency spur after performing an FFT in MATLAB
我有一个调制信号,现在我想执行 FFT。但是,我得到了高频杂散,这不应该存在(如果应该存在,我也不知道为什么)。
Lvl=[0.5,0.9,0.5,0.5,0.1,0.1,0.9,0.5];
fa=60; %the frequency of the parasitic source in hertz
np=2; %number of periods per bit
kl=length(Lvl);
t=0:0.01*np/fa:np*kl/fa;
Sig=sin(2*pi*fa*t);
for n=1:1:101
Sig(n)=Sig(n)*Lvl(1);
end
for n=102:1:201
Sig(n)=Sig(n)*Lvl(2);
end
for n=202:1:301
Sig(n)=Sig(n)*Lvl(3);
end
for n=302:1:401
Sig(n)=Sig(n)*Lvl(4);
end
for n=402:1:501
Sig(n)=Sig(n)*Lvl(5);
end
for n=502:1:601
Sig(n)=Sig(n)*Lvl(6);
end
for n=602:1:701
Sig(n)=Sig(n)*Lvl(7);
end
for n=702:1:801
Sig(n)=Sig(n)*Lvl(8);
end
plot(t,Sig)
%FFT
y = fft(Sig);
f = (0:length(y)-1)*(1/(0.01*np/fa))/length(y);
plot(f,abs(y))
title('Magnitude')
我预计只有一个 60Hz 的尖峰,周围有杂散,但我却得到了那个,并且有一个几乎 3kHz 的大尖峰,周围有杂散。
这个接近 3 kHz 的峰值应该在那里,因为实数的 fft
是围绕奈奎斯特频率(实际上是复共轭)对称的信号。奈奎斯特频率是采样频率的一半,在您的情况下,采样频率为 3000 Hz,因此奈奎斯特频率为 1500 Hz。如果您仔细观察峰值,您会发现它位于 2940 Hz(即 3000-60 Hz),因为 fft
在 1500 Hz 左右镜像。
有很多资料可以解释为什么这是傅立叶变换的 属性(例如 here)。
实际的傅里叶变换将围绕零频率进行镜像,但 fft
gives you the fast Fourier transform, which is mirrored around the nyquist frequency. You can use fftshift
将频谱集中在零频率周围。
我冒昧地通过避免重复几个 for 循环来缩短您的代码,并添加了 fftshift
。由于你的信号是真实的,你也可以选择只显示 fft 的一侧,但我会把它留给你。
Lvl=[0.5,0.9,0.5,0.5,0.1,0.1,0.9,0.5];
fa=60; % the frequency of the parasitic source in hertz
np=2; % number of periods per bit
kl = length(Lvl);
dt = 0.01*np/fa; % time step
Tend = np*kl/fa - dt; % time span
t = 0:dt:Tend; % time vector
N = length(t); % number samples
Sig=sin(2*pi*fa*t);
for n = 1:kl
ids = (1:100) + (n-1)*100;
Sig(ids) = Sig(ids).*Lvl(n);
end
% FFT
Y = fft(Sig);
fv = (0:N-1)/(N*dt); % frequency range
% FFT shift:
Y_shift = fftshift(Y);
fv_shift = (-N/2:N/2-1)/(N*dt); % zero centered frequency vector
% Plot
figure(1); clf
subplot(311)
plot(t,Sig)
title('Signal')
subplot(312)
plot(fv,abs(Y))
title('FFT Magnitude')
subplot(313)
plot(fv_shift,abs(Y_shift))
title('FFT Magnitude zero shift')
我有一个调制信号,现在我想执行 FFT。但是,我得到了高频杂散,这不应该存在(如果应该存在,我也不知道为什么)。
Lvl=[0.5,0.9,0.5,0.5,0.1,0.1,0.9,0.5];
fa=60; %the frequency of the parasitic source in hertz
np=2; %number of periods per bit
kl=length(Lvl);
t=0:0.01*np/fa:np*kl/fa;
Sig=sin(2*pi*fa*t);
for n=1:1:101
Sig(n)=Sig(n)*Lvl(1);
end
for n=102:1:201
Sig(n)=Sig(n)*Lvl(2);
end
for n=202:1:301
Sig(n)=Sig(n)*Lvl(3);
end
for n=302:1:401
Sig(n)=Sig(n)*Lvl(4);
end
for n=402:1:501
Sig(n)=Sig(n)*Lvl(5);
end
for n=502:1:601
Sig(n)=Sig(n)*Lvl(6);
end
for n=602:1:701
Sig(n)=Sig(n)*Lvl(7);
end
for n=702:1:801
Sig(n)=Sig(n)*Lvl(8);
end
plot(t,Sig)
%FFT
y = fft(Sig);
f = (0:length(y)-1)*(1/(0.01*np/fa))/length(y);
plot(f,abs(y))
title('Magnitude')
我预计只有一个 60Hz 的尖峰,周围有杂散,但我却得到了那个,并且有一个几乎 3kHz 的大尖峰,周围有杂散。
这个接近 3 kHz 的峰值应该在那里,因为实数的 fft
是围绕奈奎斯特频率(实际上是复共轭)对称的信号。奈奎斯特频率是采样频率的一半,在您的情况下,采样频率为 3000 Hz,因此奈奎斯特频率为 1500 Hz。如果您仔细观察峰值,您会发现它位于 2940 Hz(即 3000-60 Hz),因为 fft
在 1500 Hz 左右镜像。
有很多资料可以解释为什么这是傅立叶变换的 属性(例如 here)。
实际的傅里叶变换将围绕零频率进行镜像,但 fft
gives you the fast Fourier transform, which is mirrored around the nyquist frequency. You can use fftshift
将频谱集中在零频率周围。
我冒昧地通过避免重复几个 for 循环来缩短您的代码,并添加了 fftshift
。由于你的信号是真实的,你也可以选择只显示 fft 的一侧,但我会把它留给你。
Lvl=[0.5,0.9,0.5,0.5,0.1,0.1,0.9,0.5];
fa=60; % the frequency of the parasitic source in hertz
np=2; % number of periods per bit
kl = length(Lvl);
dt = 0.01*np/fa; % time step
Tend = np*kl/fa - dt; % time span
t = 0:dt:Tend; % time vector
N = length(t); % number samples
Sig=sin(2*pi*fa*t);
for n = 1:kl
ids = (1:100) + (n-1)*100;
Sig(ids) = Sig(ids).*Lvl(n);
end
% FFT
Y = fft(Sig);
fv = (0:N-1)/(N*dt); % frequency range
% FFT shift:
Y_shift = fftshift(Y);
fv_shift = (-N/2:N/2-1)/(N*dt); % zero centered frequency vector
% Plot
figure(1); clf
subplot(311)
plot(t,Sig)
title('Signal')
subplot(312)
plot(fv,abs(Y))
title('FFT Magnitude')
subplot(313)
plot(fv_shift,abs(Y_shift))
title('FFT Magnitude zero shift')