利用fft(matlab)实现时移信号的边界效应



我正试图将信号偏移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中绘制)。

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

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

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

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

最新更新