代码之家  ›  专栏  ›  技术社区  ›  Christiana S. F. Chamon

MATLAB中FFT后的高频杂散

  •  0
  • Christiana S. F. Chamon  · 技术社区  · 6 年前

    我有一个调制信号,现在我想执行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')
    

    我期望只有一个60赫兹的尖峰,周围有马刺,但我得到的是一个大的峰值,大约3千赫兹,周围有马刺。

    0 回复  |  直到 6 年前
        1
  •  3
  •   rinkert    6 年前

    fft 实数的信号是围绕奈奎斯特频率对称的(实际上是复共轭)。奈奎斯特频率是采样频率的一半,在您的例子中采样是在3000赫兹,因此奈奎斯特频率是1500赫兹。如果你仔细观察峰值,你会发现它在2940赫兹(3000-60赫兹),因为 快速傅里叶变换 镜像在1500赫兹左右。 here ).

    fft 给你快速傅里叶变换,它是围绕奈奎斯特频率镜像的。你可以用 fftshift 把频谱集中在零频率附近。

    我冒昧地缩短了代码,避免了几个for循环的重复,并添加了 . 既然你的信号是真实的,你也可以选择只显示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')
    

    enter image description here