0

我在 dsp.stackexchange 上发布了这个问题,并被告知它与 stackoverflow 更相关,因为它主要是一个编程问题:

我正在尝试编写一个代码,它允许我在频域中改变信号的相位。但是,我的输出并不完全正确,所以一定有问题。举一个简单的例子,假设我们有函数 y = sin(2*pi*t) 并且想要实现 -pi/2 的相移。我的代码如下所示:

clear all
close all

N = 64; %number of samples
fs = 10; %sampling frequency
ts = 1/fs; %sample interval
tmax = (N-1)*ts;
t = 0:ts:tmax;
y = sin(2*pi*t);

figure
plot(t,y)

% We do the FT
f = -fs/2:fs/(N-1):fs/2;
Y = fftshift(fft(y));

% Magnitude spectrum
figure
plot(f,abs(Y));

phase = angle(Y);

% Phase spectrum
figure
plot(f,phase)

Y = ifftshift(Y)

% Attempt at phase shift
Y = Y.*exp(-i*2*pi*f*pi/2);

% Inverse FT
u = ifft(Y);

figure
plot(t,real(u))

除了看起来如下的最终图之外,所有图看起来都不错:

具有相位变化的信号图

这看起来几乎是正确的,但并不完全正确。如果有人可以给我一些关于如何更正我的代码以解决此问题的指示,我将不胜感激!我感觉我的错误与线路有关Y = Y.*exp(-i*2*pi*f*pi/2);,但我不知道如何解决它。

4

2 回答 2

4

我无法真正了解傅立叶分析的详细信息(因为我并不真正了解它们),但我可以提供一个带有一些提示的可行解决方案:

首先,你应该用想象的方式表达你的波浪,即:

y = exp(1i*2*pi*t);

更重要的是,您必须真正改变相位,而不会弄乱整个频谱:

% Attempt at phase shift
Y = abs(Y).*exp(1i*angle(Y)-1i*pi/4); % -pi/4 shift

您应该注意,这种转变不再与频率有关,我认为这是有道理的。最后你可以绘制结果:

figure
plot(t,real(u),'k')
hold on
plot(t,real(y),'r')

real(y)实际上是一个余弦函数,你从正弦开始,但希望你明白了。对于 pi/4 班次,我得到了这样的东西(从红色开始,以黑色结束):

这是这里的图片描述,你好吗?

于 2014-09-21T21:30:07.353 回答
3

您在代码设计中犯了 3 个主要错误。

  1. FFT 的输入向量被解释为一个无限重复的信号周期。这意味着您的输入向量应该包含整数个正弦信号的完整周期。您有 64 个样本的输入向量和 10 的采样率。这会导致正弦波的 6.4 个周期,这会导致泄漏。如果你在执行 FFT 之后检查频谱,你会看到,没有两条干净的频率线,而是在两个地方周围有很多频率分量。
  2. 校正输入向量后,应该只有两个单一频率的值不接近于零。62 个频率分量将由非常接近于零的数值噪声组成。计算这些值的相位会产生垃圾数据。
  3. 如果 N 是输入样本的数量,则时域中 pi/2 的相移等效于时域中的 N/4 偏移。

我修改了你的代码。你会在下面找到它。使用变量 M,您可以更改输入向量中正弦波的周期数。在示例中,我设置了 M=3。

clear all;
close all;

T = 1;  %length of sampling sequence in s
N = 64; %number of samples
M = 3; % number of periods per sequence
ts = T/N; %sample interval
fs = 1/ts %sampling frequency
tmax = (N-1)*ts;
t = 0:ts:tmax;
y = sin(2*pi*M*t);

fig01 = figure;
plot(t,y);
grid on;

%% We do the FT
Y = fft(y);

%% We create a frequency vector in natural order
% -fs/2, ..., 0, ... +fs/2
f =fftshift(( 0:(fs-1)) - fs/2);

%% Show Magnitude spectrum
% There shold be only two lines at -M and +M
figure;
plot(f,abs(Y),'o');
grid on;

%% Attempt at phase shift
% y/t) -> Y(w)
% y(t-t0) -> Y(w) * exp(-i*w*t0)
% Phase shift of pi/2 in frequncy domain is equavalent to as time shift
% of T/4 in time domain

Y = Y.*exp(-i*2*pi*f*T/4);

% Inverse FT
u = ifft(Y);

figure
hold on;
plot(t,real(u),'b-');
plot(t,real(y),'r-');
hold off;
grid;

输入信号 三个周期的正弦信号

具有三个正弦信号周期的输入信号

输入信号的频谱。 -3 和 +3 处的频率线

输入信号的频谱。-3 和 +3 处的频率线

输入信号(蓝色)和相移信号(红色)

输入信号(蓝色)和相移信号(红色)

于 2014-09-22T11:45:58.940 回答