改变频域信号的相位(MatLab)

时间:2014-09-21 20:35:44

标签: 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 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))

所有情节看起来都不错,除了最终情节如下:

Plot of signal with phase change

这看起来几乎正确但不完全正确。如果有人能给我一些关于如何纠正我的代码以便解决这个问题的指示,我将非常感激!我觉得我的错误与行Y = Y.*exp(-i*2*pi*f*pi/2);有关,但我不确定如何修复它。

2 个答案:

答案 0 :(得分:4)

我无法真正了解傅立叶分析细节(因为我真的不知道它们),但我可以提供一些有一些提示的工作解决方案:

首先,你应该以虚构的方式表达你的wave,即:

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班次,我得到了这样的东西(以红色开始,以黑色结束):

this is image description here, how are You?

答案 1 :(得分:3)

您在代码设计中犯了3个重大错误。

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

    input signal three periods of a sine signal

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

    spectrum of input signal. Frequency lines at -3 and +3

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

    input signal (blue) and phase shifted signal (red)

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