Высокочастотная шпора после выполнения БПФ в MATLAB - PullRequest
1 голос
/ 07 ноября 2019

У меня модулированный сигнал, и теперь я хочу выполнить БПФ. Тем не менее, я получаю ответвление на высокой частоте, которого там быть не должно (и если это произойдет, я понятия не имею, почему).

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 кГц с шипами вокруг него.

1 Ответ

2 голосов
/ 07 ноября 2019

Этот пик при частоте почти 3 кГц должен присутствовать, поскольку fft реального сигнала симметричен относительно частоты Найквиста (фактически комплексного сопряжения). Частота Найквиста равна половине частоты дискретизации, в вашем случае выборка выполняется при 3000 Гц, таким образом, частота Найквиста составляет 1500 Гц. Если вы посмотрите поближе на пик, вы увидите, что он находится на 2940 Гц (что составляет 3000-60 Гц) из-за того, что fft отражается около 1500 Гц. Существует множество источников, объясняющих, почему это свойство преобразования Фурье (например, здесь ).

Фактическое преобразование Фурье будет отражено вокруг нулевой частоты, но fft дает вам быстрое преобразование Фурье, которое отражается вокруг частоты Найквиста. Вы можете использовать fftshift, чтобы центрировать спектр вокруг нулевой частоты.

Я позволил себе сократить код, избегая повторения нескольких циклов for, и добавил fftshift. Поскольку ваш сигнал настоящий, вы также можете выбрать показ только одной стороны БПФ, но я оставлю это на ваше усмотрение.

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

...