[英]Delay a signal in time domain with a phase change in the frequency domain after FFT
我在Matlab腳本中實現了基本時間/頻率屬性的問題。 該物業是:
我試圖在Matlab腳本中實現它。 我假設一個頻率值為5Hz的正弦信號,采樣頻率等於800Hz,我想把這個信號延遲1.8秒。 所以我實現了這個腳本:
Fs = 800;
Time_max = 4; % seconds
t = 0:(1/Fs):Time_max;
delay = 1.8; % One second of delay
f = 5; %Hz
y = sin(2 * pi * f * t);
figure
subplot(2,1,1)
plot(t,y);
xlabel('time (s)')
legend('Original');
%FFT
SIZE = 2^nextpow2(length(y));
Y = fft(y,SIZE);
df = Fs/SIZE;
f= -Fs/2:df:Fs/2 - df;
for k = 1:SIZE
Y(k) = Y(k)*exp(-(1i*2*pi*f(k)*delay));
end
subplot(2,1,2)
plot(real(ifft(Y)),'r')
legend('Shifted');
輸出圖是:
問題出在哪兒? 如何實現正確的延時?
謝謝
問題不在於實現,而在於FFT的屬性(分別是DFT):你發布的時間延遲的公式是正確的,但你必須記住,你正在進行循環移位 。 這意味着從2.2s到4.0s的所有信號部分將被復制到輸出的開頭。 這正是你所看到的:
您想要的信號從1.8s開始,但是從0到0.6837s,由於循環移位而插入的部分。 小計算:輸入信號為1 x 3201
,即零填充895個零。 在幾秒鍾內,這是1.1187秒的零。 循環移位將在開頭插入最后的1.8s,即1.8 - 1.1187 = 0.86秒不會為零而是包含正弦。 這正是我們在情節中看到的數量。
為了避免這種影響,您必須用至少為延遲信號的零點填充輸入信號。 在你的情況下,將是
Fs = 800;
Time_max = 4; % seconds
t = 0:(1/Fs):Time_max;
delay = 1.8; % One second of delay
f = 5; %Hz
y = sin(2 * pi * f * t);
y = [y, zeros(1,delay*Fs)]; % Zero-pad the signal by the amount of delay
SIZE = 2^nextpow2(length(y));
Y = fft(y,SIZE);
df = Fs/SIZE;
f= -Fs/2:df:Fs/2 - df;
for k = 1:SIZE
Y(k) = Y(k)*exp(-(1i*2*pi*f(k)*delay));
end
td = (0:SIZE-1)/Fs;
yd = real(ifft(Y));
這給了我們
你可以試試這個:
Fs = 800;
Time_max = 4; % seconds
t = 0:(10/Fs):Time_max;
delay = 1.8; % One second of delay
f = 5; %Hz
y = sin(2 * pi * f * t);
figure;subplot(2,1,1);plot(t,y);xlabel('time (s)')
legend('Original');
w = 2*pi*f;
X=fft(y);
Y=X.*exp(-1i*w*(t+delay));
ynew = real(ifft(Y));
subplot(2,1,2);plot(ynew);
legend('Shifted');
考慮使用矢量化實現,您可以擺脫for-loop
。
結果如下:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.