通过傅立叶变换进行振荡和频谱

时间:2017-04-25 14:57:03

标签: c++ fftw spectrum frequency-analysis spectrogram

我试图找到由表示图像中像素运动的数据向量生成的波形的振荡和频谱频率。

数据存储在.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)和频谱(振幅),下面给出了图的一个例子。

example of the oscillation graph

我已经阅读并讨论了很多关于使用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;
}

1 个答案:

答案 0 :(得分:2)

您的代码的主要问题是,当您离开条件范围时,变量std::vector<double> in将被销毁:if (myfile.is_open())

此外,代码不会以任何方式使用表示输入文件中曲线的值,因此根据当前布局的情况,代码无法找到振荡频率