1

我试图通过 numbars 移动信号,并通过将每个频率的相位移动其 numbars 等效值来“推断”信号。以下代码工作正常,除了最后一个(预测的)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']);

问题是信号的最后一个数字不是“正确的”,似乎环绕到信号的开头 - 最后 3 个外推的柱应该上升,但它们会下降到移位信号开始的区域(没有足够的声誉来添加图像,请在 matlab 中绘制)。

4

1 回答 1

1

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

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

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

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

于 2014-02-09T15:19:27.180 回答