GBT6323中针对汽车频域特性的角脉冲试验那位有处理程序可以分享一下吗?
简单的示例程序
#include <iostream>
#include <fstream>
#include <vector>
#include <complex>
#include <cmath>
using namespace std;
const double pi = 3.14159265358979323846;
vector<complex<double>> fft(const vector<complex<double>> &x)
{
int n = x.size();
if (n == 1) return vector<complex<double>> {x[0]};
vector<complex<double>> x0, x1;
for (int i = 0; i < n; i++)
(i % 2 == 0 ? x0 : x1).push_back(x[i]);
auto y0 = fft(x0), y1 = fft(x1);
vector<complex<double>> y(n);
for (int i = 0; i < n / 2; i++)
{
complex<double> t = polar(1.0, -2 * pi * i / n) * y1[i];
y[i] = y0[i] + t;
y[i + n / 2] = y0[i] - t;
}
return y;
}
vector<double> conv(const vector<double> &x, const vector<double> &y)
{
int n = x.size(), m = y.size();
vector<complex<double>> a(n), b(m);
for (int i = 0; i < n; i++) a[i] = complex<double>(x[i], 0);
for (int i = 0; i < m; i++) b[i] = complex<double>(y[i], 0);
int k = 1;
while (k < n + m) k *= 2;
a.resize(k), b.resize(k);
auto c = fft(a), d = fft(b);
for (int i = 0; i < k; i++) c[i] *= d[i];
auto e = fft(c);
vector<double> z(n + m - 1);
for (int i = 0; i < n + m - 1; i++) z[i] = e[i].real() / k;
return z;
}
int main()
{
ifstream fin("input.txt");
ofstream fout("output.txt");
int n, m;
fin >> n >> m;
vector<double> x(n), y(m);
for (int i = 0; i < n; i++) fin >> x[i];
for (int i = 0; i < m; i++) fin >> y[i];
auto z = conv(x, y);
for (int i = 0; i < z.size(); i++) fout << z[i] << endl;
return 0;
}