尝试用复数进行解复述傅立叶变换时出现分段错误

  • 本文关键字:变换 分段 傅立叶 错误 c++
  • 更新时间 :
  • 英文 :


我试图用C++编写一个DFT函数。此函数将获取一个复数向量,应用DFT,然后返回另一个复数矢量。然后我试着让它从我的计算机上读取文件,应用该函数,然后将结果写入其他文件。当我运行它时,我遇到了一个分段错误。遵循本网站的第一条评论(c++Can';t find error(,我运行gdb到代码,然后它返回如下:

Program received signal SIGSEGV, Segmentation fault.
0x0000555555557088 in std::complex<double>::__rep (this=0x0) at /usr/include/c++/10/complex:1363
1363          _GLIBCXX_CONSTEXPR _ComplexT __rep() const { return _M_value; }

然后我深入研究,发现我使用的编译器g++在4.9版本中出现了这个问题。我检查了一下我的,得到了这个:

g++ (Ubuntu 10.3.0-1ubuntu1) 10.3.0

这是代码:

#include <bits/stdc++.h>
using namespace std;
const float pi = 3.14159265358979;
vector<complex<double>> dft(vector<complex<double>> x){
int N = x.size();
vector<complex<double>> X;
for (int k = 0; k < N; k++){
double re = 0;
double im = 0;        
for (int n = 0; n < N; n++){
double phi = (2 * pi * k * n) / N;
re += x[n].real() * cos(phi);
im -= x[n].imag() * sin(phi);
}
complex<double> result (re, im);
X.push_back(result);
}
return X;
}
int main(){
string temp;
vector<complex<double>> x, y;
vector<complex<double>> result_x, result_y;
ifstream x_data, y_data;
x_data.open("x.txt", ios::in);
y_data.open("y.txt", ios::in);
ofstream res_x, res_y;
res_x.open("result_x.txt", ios::out | ios::app);
res_y.open("result_y.txt", ios::out | ios::app); 
while(x_data >> temp){
float temp_0 = stof(temp);
complex<double> adder (temp_0, 0);
x.push_back(adder); 
}
while (y_data >> temp){
float temp_0 = stof(temp);
complex<double> adder (temp_0, 0);
y.push_back(adder);
}
result_x = dft(x);
result_y = dft(y);
for (unsigned int k = 0; k <= result_x.size(); k++){
int freq = k;
float amp_x = abs(result_x[k]);
float phase_x = arg(result_x[k]);
float amp_y = abs(result_y[k]);
float phase_y = arg(result_y[k]);
res_x << "[" << freq << ", " << amp_x << ", " << phase_x << "]" << endl;
res_y << "[" << freq << ", " << amp_y << ", " << phase_y << "]" << endl;
}
x_data.close();
y_data.close();
res_x.close();
res_y.close();
cout << "DONE!" << endl;
return 0;
}

问题是您在for循环中使用了k <= result_x.size()而不是k < result_x.size()。因此,在最后一次迭代(当k = result_x.size()时(,您会得到result_x[k];未定义行为。您可以通过修改for循环来解决问题,使其看起来像:

for (unsigned int k = 0; k < result_x.size(); k++){//note i've used < instead of <=
//...other code here
}

最新更新