频域中信号的相位变化(MatLab)
我在dsp.stackexchange上发布了这个问题,并被告知它与stackoverflow更相关,因为它主要是一个编程问题: 我正在尝试编写一个代码,它允许我在频域中改变信号的相位。然而,我的输出并不完全正确,所以一定是出了什么问题。对于一个简单的例子,假设我们有函数y=sin(2*pi*t),并且想要实现-pi/2的相移。我的代码如下所示:频域中信号的相位变化(MatLab),matlab,filter,signal-processing,phase,Matlab,Filter,Signal Processing,Phase,我在dsp.stackexchange上发布了这个问题,并被告知它与stackoverflow更相关,因为它主要是一个编程问题: 我正在尝试编写一个代码,它允许我在频域中改变信号的相位。然而,我的输出并不完全正确,所以一定是出了什么问题。对于一个简单的例子,假设我们有函数y=sin(2*pi*t),并且想要实现-pi/2的相移。我的代码如下所示: clear all close all N = 64; %number of samples fs = 10; %sampling frequenc
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))
除最终绘图外,所有绘图均正常,如下所示:
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)有关代码>,但我不确定如何修复它。我无法真正了解傅里叶分析的详细信息(因为我并不真正了解它们),但我可以提供一个有效的解决方案,并提供一些提示:
首先,你应该用想象的术语来表达你的波浪,即:
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轮班,我得到了如下结果(以红色开始,以黑色结束):
您在代码设计中犯了3个主要错误
FFT的输入向量被解释为无限重复的信号周期。
这意味着您的输入向量应该包含完整正弦周期的整数
信号。您的输入向量为64个样本,采样率为10。结果是6.4
导致泄漏的正弦波周期。如果你检查后的频谱
执行FFT,你会看到,没有两条干净的频率线,但是有很多
两个地方的频率分量
修正输入向量后,应该只有两个单一频率值
它们不接近于零。62个频率分量将由数字噪声组成
接近零。计算这些值的相位会产生垃圾数据
如果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处的频率线
输入信号(蓝色)和相移信号(红色)非常感谢!这真的很有帮助!谢谢!我真的很感激!