我在執行FFT計劃時出現問題,因爲它存在fftw
庫。我聲明瞭尺寸爲2048的fftIn
和fftOut
向量,並定義了它們的fftwf_plan_dft_1d
。執行FFT計劃後,FFTW輸出矢量大小錯誤
但是,當我執行計劃,突然fftOut
矢量得到完全錯誤的。在我的代碼中,我可以在調試時看到它的大小從2048變爲0.當我編寫下面的小可執行示例時,我只是得到不合適的大小,例如17293858104588369909.
當然,當我嘗試訪問向量的第一項,發生SIGSEGV
。
我的代碼:
#include <complex>
#include <iostream>
#include <fftw3.h>
#include <vector>
using namespace std;
typedef std::vector<std::complex<float>> fft_vector;
int main() {
const unsigned int VECTOR_SIZE = 2048;
fft_vector* fftIn = new fft_vector(VECTOR_SIZE);
fft_vector* fftOut = new fft_vector(VECTOR_SIZE);
fftwf_plan fftPlan = fftwf_plan_dft_1d(VECTOR_SIZE, reinterpret_cast<fftwf_complex*>(fftIn), reinterpret_cast<fftwf_complex*>(fftOut), FFTW_FORWARD, FFTW_ESTIMATE);
fftwf_execute(fftPlan);
std::cout << fftOut->size() << std::endl;
std::cout << fftOut->at(0).real() << fftOut->at(0).imag() << std::endl;
return 0;
}
當然,我知道fftIn
向量是空在這個例子中,但輸出被打破時,它不是無妨。在這種情況下,SIGSEGV發生在第二個cout中,如前所述。
我的完整代碼有線程(但FFT發生在同一個線程中,所以競爭條件不應該適用),這是試圖在這個小例子中隔離代碼的原因之一,以防萬一,但無論如何,它似乎有什麼問題。
有什麼想法?
它應該工作:http://www.fftw.org/doc/Complex-numbers.html#Complex-numbers無論如何,我會嘗試你建議的經典代碼 –
@RomanRdgz是的,它應該。主要問題是你傳遞的是矢量而不是矢量的內容。使用fftw的類型和分配是額外的保險,您可以從fftw中獲得您想要的行爲和表現。還要注意在該鏈接中使用「should」這個詞:它可能無法保證(至少對所有平臺上的所有編譯器)C++複雜<>類型可以工作。 – Andrew
只是好奇:如果可能用C++ complex <>來做,我應該如何重寫代碼?保持fftIn和fftOut爲動態矢量,因爲我需要它們的大小是可配置的。另一方面,我不清楚如何訪問輸出矢量內容。 (&fftOut [0])。x? –