【问题标题】:Understanding results of netlib fftpack了解 netlib fftpack 的结果
【发布时间】:2020-03-09 11:51:40
【问题描述】:

我需要在 C++ 中实现一个跨平台的 STFT,它既可以从 python 调用,也可以编译为在 iOS/Android 上运行。我选择使用fftpack,因为它是轻量级的,而且似乎可以很快地进行 FFT。

我已经用 C 编写了测试代码:

int n = 8;
float wsave[2*n + 15];
int ifac[n+15];

float arr[8] = {11.0, 3.0, 4.05, 9.0, 10.3, 8.0, 4.934, 5.11};


// initialize  rfftf and rfftb
__ogg_fdrffti(n, wsave, ifac);

// forward transform of a real periodic sequence
__ogg_fdrfftf(n, arr, wsave, ifac);


// Print result
std::cout << "[";
for(int k=0; k<n-1; k++){
    std::cout<<arr[k] << ", ";
}
std::cout << arr[n-1] << "]" << std::endl;

// Result: [55.394, -5.58618, 1.66889, 12.316, 3.11, 6.98618, -0.0991108, 5.174]

为了尝试我的代码,我在同一个数组上运行了 scipy rfft

arr = np.array([11.0, 3.0, 4.05, 9.0, 10.3, 8.0, 4.934, 5.11])
res = np.real(rfft(arr, n=8))
print(res) # Prints [55.394      -5.58617928 12.316       6.98617928  5.174     ]

为什么 scipy 的值更少。看起来 scipy 因此从同一个结果数组中跳过了一些值,但为什么呢?如何在 C++ 中从arr 读取正确的 FFT 值?

【问题讨论】:

  • 当我在下面写下我的答案时,我什至没有尝试您正在使用的 numpy.real(...) 函数(它 numpy.real(),对吗?),但现在我有。它也返回与您从 C++ 版本获得的完全相同的数组。

标签: python c++ ios signal-processing fft


【解决方案1】:

您从 C++ 程序中获得的值与在 Python 脚本中获得的值相同。只是你把python脚本中的虚部扔掉了:

#!/usr/bin/python3

from scipy.fftpack import rfft

arr = [11.0, 3.0, 4.05, 9.0, 10.3, 8.0, 4.934, 5.11]
res = rfft(arr, n=8)
print(res)

输出

[55.394      -5.58617928  1.66888853 12.316       3.11        6.98617928
 -0.09911147  5.174     ]

【讨论】:

    猜你喜欢
    • 2020-05-07
    • 2012-01-25
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多