我试图找到由表示图像中像素运动的数据 vector 生成的波形的振荡和频谱频率。
数据存储在 .txt 文件中,如下所示:
75.000000
60.000000
52.000000
61.000000
66.000000
78.000000
86.000000
74.000000
59.000000
47.000000
58.000000
60.000000
81.000000
85.000000
81.000000
70.000000
58.000000
59.000000
56.000000
61.000000
77.000000
88.000000
82.000000
79.000000
75.000000
75.000000
75.000000
75.000000
76.000000
82.000000
82.000000
这个想法是找到从数据中获得的图表的振荡频率(Hz)和频谱(幅度),图表的一个例子如下所示。
我已经阅读并讨论了很多关于使用 fftw3 库进行傅立叶分析的内容,我是 C++ 的新手,甚至更多地使用了这个库。
我希望你能帮助我提供代码或想法来解决我的问题。
非常感谢您的帮助。
我使用 Microsoft Visual C++ 2010(win32)
代码:
#include "StdAfx.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <fftw3.h>
#include <iostream>
#include <cmath>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int i;
const int N=100;//Number of points acquired inside the window
double Fs=200;//sampling frequency
double dF=Fs/N;
double T=1/Fs;//sample time
double f=86;//frequency
double *in;
fftw_complex *out;
double ff[N];
fftw_plan plan_forward;
in = (double*) fftw_malloc(sizeof(double) * N);
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
std::ifstream myfile ("Vetor_Oscilacao2.txt");
if (myfile.is_open())
{
std::vector<double> in;
std::string line;
while (std::getline(myfile, line))
{
double value = std::stod(line);
std::cout << value << '\n';
in.push_back(value);
}
myfile.close();
}
else
std::cout << "Unable to open file";
std::cin.get();
for (int i=0; i<= ((N/2)-1);i++)
{
ff[i]=Fs*i/N;
}
plan_forward = fftw_plan_dft_r2c_1d ( N, in, out, FFTW_ESTIMATE );
fftw_execute ( plan_forward );
double v[N];
for (int i = 0; i<= ((N/2)-1); i++)
{
v[i]=(10*log(sqrt(out[i][0]*out[i][0]+ out[i][1]*out[i][1])))/N; //Here I have calculated the y axis of the spectrum in dB
}
fstream fichero;
fichero.open("example2.txt",fstream::out);
fichero << "plot '-' using 1:2" << std::endl;
for(i = 0;i< ((N/2)-1); i++)
{
fichero << ff[i]<< " " << v[i]<< std::endl;
}
fichero.close();
fftw_destroy_plan (plan_forward);
fftw_free (in);
fftw_free (out);
return 0;
}
最佳答案
您的代码的主要问题是,当您离开条件范围时,变量 std::vector<double> in
将被销毁: if (myfile.is_open())
。
此外,代码并没有以任何方式使用代表输入文件中曲线的值,因此,鉴于当前的布局方式,代码实际上无法找到振荡频率。
关于c++ - 通过傅立叶变换的振荡和频谱,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43614234/