我正在尝试从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
我做错了什么?
答案 0 :(得分:0)
上面的代码看起来像你在文章中引用的逆DFT。根据您预期的所需输入/输出,您似乎需要廉价的线性插值而不是DFT /逆DFT解决方案。
从上面所需的输入/输出关系语句中,您似乎在时间序列输入和所需的时间序列输出之间存在所需的关系。
您编码的逆DFT将从频域到时域。
从我的陈述中收集的内容,从系列[1,1-> 9]开始,进行前向DFT(进入频域),然后将该结果转换为逆DFT(以取回到时域)。
希望这对你来说是正确的方向。