我试图通过腰部移位信号并通过将每个频率的相位移动到其等效的“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中绘图。
答案 0 :(得分:1)
如果外推为较长的纯正弦曲线,则FFT和IFFT变换的基矢量都是圆形的。因此,任何使用仅使用这些基础向量进行重建的数据“外推”必然是循环的,并且末尾环绕到数据窗口的开头。
这是IFFT的基础(与FFT的长度相同)。
为了可能消除部分圆形效应,您可以尝试在FFT结果中插入频率的所有频谱峰值,然后使用原始窗口中不是周期性的任何插值频率峰值进行外推重建,而不是这些峰周围的FFT区间是周期性的。如此估计的任何非周期性孔径频率将不会在原始FFT长度中循环回绕。您可以使用长度更长的IFFT,或者通过简单地求和正弦曲线,使用原始FFT长度不是周期性的频率来创建信号,用于(重新)构造或尝试外推。
补充:自动回归,线性预测或最大似然算法(而不是用于分析的初始FFT)也可能更适合外推使用。