我正在尝试找到用数据向量表示图像中一个像素运动生成的波形的振荡和频谱频率。
该数据被存储在一个 .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;
}