gpt4 book ai didi

matlab - FFT 后在时域中延迟具有频域中相位变化的信号

转载 作者:行者123 更新时间:2023-12-02 03:23:35 27 4
gpt4 key购买 nike

我在 Matlab 脚本中实现的基本时间/频率属性有问题。
该属性(property)是:

im1

我试图在 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');

输出图是:

output plot

哪里有问题?我怎样才能达到正确的时间延迟?

谢谢

最佳答案

问题不在于实现,而在于 FFT(分别对应于 DFT)的属性:您发布的时间延迟公式是正确的,但您必须记住,您正在执行循环移位.这意味着从 2.2s 到 4.0s 的所有信号部分都将被复制到输出的开头。这正是你所看到的:

before

您想要的信号确实从 1.8s 开始,但是从 0 到 0.6837s 有由于循环移位而插入的部分。小算盘:你的输入信号是1 x 3201 ,即它将用 895 个零填充零。以秒为单位,这是 1.1187 秒的零。循环移位将在开头插入最后 1.8 秒,即 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));

这给了我们

result

关于matlab - FFT 后在时域中延迟具有频域中相位变化的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31586803/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com