在 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')