Я пытаюсь найти частоту колебаний и спектра сигнала, генерируемого вектором данных, представляющих движение пикселя в изображении.
Данные хранятся в файле .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
Идея состоит в том, чтобы найти частоту колебаний (Гц) и частотный спектр (амплитуду) графика, полученного из данных, пример графика представлен ниже.
Я много читал и говорил об использовании библиотеки 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())
,
Кроме того, код никоим образом не использует значения, представляющие кривую из входного файла, так что на самом деле код не может найти частота колебаний учитывая, как это в настоящее время выложено.
Других решений пока нет …