重新采样频域中的时间序列(FFT)

时间:2016-12-07 19:59:21

标签: r signal-processing

我正在尝试从DSP Guide,等式8-2实现“合成方程式”,因​​此我可以重新采样频域中的时间序列。我读方程的方式,N是输出点的数量,并且给定k从0到N / 2的循环,我最多只能重采样到原始采样率的两倍。

我尝试在R中编写一个快速实现,但结果与我期望的结果并不相符。我的代码:

input <- c(1:9)
nin <- 9
nout <- 17
b <-fft(input)

reals <- Re(b) / (nout / 2)
imags <- Im(b) / (nout / 2)
reals[1] <- reals[1] / 2
reals[(nout/2)] <- reals[(nout/2)] / 2

output <- c(1:nout)
for (i in 1:nout)
{
    realSum <- 0
    imagSum <- 0
    for (k in 1:(nout/2))
    {
        angle <- 2 * pi * (k-1) * (i-1) / nout
        realSum <- realSum + (reals[k] * cos(angle))
        imagSum <- imagSum - (imags[k] * sin(angle))
    }

output[i] <- (realSum + imagSum)
}

对于我的输入(例如1秒采样,重新采样到0.5秒)

[1] 1 2 3 4 5 6 7 8 9

我得到了输出

[1] -0.7941176  1.5150954  0.7462716  1.5022387  1.6478971  1.8357487  
2.4029773  2.1965426  3.1585254  2.6178195  3.7284660  3.3721128  3.8433588  4.6390705
[15]  3.4699088  6.3005605  2.8175240

而我的预期输出是

[1] 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7 7.5 8 8.5 9

我做错了什么?

1 个答案:

答案 0 :(得分:0)

上面的代码看起来像你在文章中引用的逆DFT。根据您预期的所需输入/输出,您似乎需要廉价的线性插值而不是DFT /逆DFT解决方案。

从上面所需的输入/输出关系语句中,您似乎在时间序列输入和所需的时间序列输出之间存在所需的关系。

您编码的逆DFT将从频域到时域。

从我的陈述中收集的内容,从系列[1,1-> 9]开始,进行前向DFT(进入频域),然后将该结果转换为逆DFT(以取回到时域)。

希望这对你来说是正确的方向。