使用fft(matlab)的时移信号的边界效应

时间:2014-02-09 12:14:06

标签: matlab time fft shift phase

我试图通过腰部移位信号并通过将每个频率的相位移动到其等效的“npm”信号来“推断”信号。 以下代码工作正常,除了最后(预测)的numbars环绕到第一个值。我这样做是错误的还是(i)fft的基础(这个方法不能用来推断信号)?

    t = 1:97;
    x = sin(2*pi*1/10*t+ 2*pi/4) + -0.5+0.01*t + cos(2*pi*1/20*t+pi/3); % eg signal
    numbars = 3; %shift by 3 bars into the future

    % algorithm:
    N = length(x);
    df = 1/N;
    X = fft(x);
    Q = ceil((N+1)/2); % Q = No. of unique spectral points for real-valued time signals
    fQ = (Q-1)*df; % Maximum real frequency
    if N==2*Q-1 % N odd
        X = [ X(1:Q), fliplr(conj(X(2:Q))) ];
    else % N even (= 2*Q-2)
        X = [ X(1:Q), fliplr(conj(X(2:Q-1))) ];
    end;

    %Convert the unipolar spectrum to the bipolar frequency form
    if N==2*Q-1 % N odd
        Xb = [ fliplr(conj(X(2:Q))), X(1:Q) ];
        fb = [ -fQ: df : fQ ];
    else % N even (= 2*Q-2)
        Xb = [ fliplr(conj(X(2:Q-1))), X(1:Q) ];
        fb = [ -fQ: df : fQ-df ];
    end

    % Now to implement a time advance z(t) = x(t+t0)
    t0 = numbars;
    phi0b = 2*pi*fb*t0;
    newsig1 = real(ifft (ifftshift (exp(-1i*phi0b).* Xb)));
    plot([x' newsig1']);

问题是信号的最后一个numbars不是'正确',似乎包裹到信号的开头 - 最后3个外推条应该上升,但它们会向下移动到转移信号开始的区域(不要没有足够的声誉来添加图像,请在matlab中绘图。

1 个答案:

答案 0 :(得分:1)

如果外推为较长的纯正弦曲线,则FFT和IFFT变换的基矢量都是圆形的。因此,任何使用仅使用这些基础向量进行重建的数据“外推”必然是循环的,并且末尾环绕到数据窗口的开头。

这是IFFT的基础(与FFT的长度相同)。

为了可能消除部分圆形效应,您可以尝试在FFT结果中插入频率的所有频谱峰值,然后使用原始窗口中不是周期性的任何插值频率峰值进行外推重建,而不是这些峰周围的FFT区间是周期性的。如此估计的任何非周期性孔径频率将不会在原始FFT长度中循环回绕。您可以使用长度更长的IFFT,或者通过简单地求和正弦曲线,使用原始FFT长度不是周期性的频率来创建信号,用于(重新)构造或尝试外推。

补充:自动回归,线性预测或最大似然算法(而不是用于分析的初始FFT)也可能更适合外推使用。