从FFT预测未来值

时间:2015-01-05 21:21:26

标签: matlab

在附带的代码中,我创建了一个任意复杂的信号发生器(在这种情况下为3个正弦波)并使用它生成256 + 50个值。然后,我使用前256个值创建FFT,绘制它们然后进行逆FFT并验证它是否产生原始信号的非常接近的表示。到目前为止一切都很好。

我现在要做的是,使用FFT结果,尝试生成不属于FFT数据集的附加50个值。 MatLab有直接的进展吗?

我没有确切地知道如何假设我可以使用每个bin的中心频率和FFT结果创建一个信号发生器并以这种方式生成信号,但在我走下去之前这看起来似乎很多工作我想我是否有一种简单的方式让我找不到。

我有MatLab&此时使用的信号处理和DSP封装。

谢谢!

FFTsize = 256;
futureSize = 50;
t = 1:FFTsize+futureSize;

F1_bars = 10;
RadPerBar1 = (2*pi)/F1_bars;
L1 = 1;
Offset1 = 0;

F2_bars = 8;
RadPerBar2 = (2*pi)/F2_bars;
L2 = 1;
Offset2 = 0;

F3_bars = 50;
RadPerBar3 = (2*pi)/F3_bars;
L3 = 1;
Offset3 = 0;

Sig = (L1*sin(RadPerBar1*t + Offset1) +...
       L2*sin(RadPerBar2*t + Offset2) +...
       L3*sin(RadPerBar3*t + Offset3));


DataSet = Sig(1:FFTsize);

FFT = fft(DataSet)/FFTsize;
%Suggested by Mad Physicist 
paddedFFT = [FFT(1:ceil(FFTsize/2)) zeros(1, futureSize) FFT(ceil(FFTsize/2)+1 : end)];

IFFT = ifft(FFT)*FFTsize;
%Suggested by Mad Physicist 
IFFT2 = ifft(paddedFFT)*(FFTsize + futureSize);

figure(111);
hold off;
plot(abs(FFT));
hold on;
plot(abs(paddedFFT),'--r');
legend('FFT','Padded FFT','Position','best');
hold off;

figure(110)
hold off;
plot(Sig);
hold on;
plot(IFFT,'--r');
plot(t, IFFT2,'g');
legend('Input Signal','IFFT','Padded IFFT','Position','best');
hold off;

1 个答案:

答案 0 :(得分:0)

在反转之前用50个零填充FFT:

futureSize = 50;
paddedFFT = [FFT(1:ceil(FFTsize/2)) zeros(1, futureSize) FFT(ceil(FFTsize/2)+1 : end)];
IFFT = ifft(paddedFFT)*(FFTsize + futureSize);