J'essaie de trouver l'oscillation et la fréquence spectrale de la forme d'onde générée par un vecteur de données représentant le mouvement d'un pixel dans une image.Oscillations et spectre de fréquence à travers une transformée de Fourier
Les données sont stockées dans un fichier .txt, comme suit:
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
L'idée est de trouver la fréquence d'oscillation (Hz) et le spectre de fréquence (amplitude) de la courbe obtenue à partir des données, un exemple du graphique est présenté ci-dessous.
J'ai lu et beaucoup parlé de l'utilisation de la bibliothèque fftw3 pour l'analyse de Fourier, je suis nouveau à l'aide de C++ et encore plus de cette bibliothèque.
J'espère que vous pouvez m'aider avec du code ou des idées pour résoudre mon problème.
Merci beaucoup pour votre aide.
Je travaille avec Microsoft Visual C++ 2010 (win32)
code:
#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;
}
Bienvenue sur stackoverflow. L'idée ici est que vous essayez dur avant de demander. Alors, qu'avez-vous essayé jusqu'ici et où êtes-vous resté coincé? – Walter
Essayez de faire ma première approximation avec les informations fournies dans: https://stackoverflow.com/questions/32276728/plotting-frequency-spectrum-with-c J'ai modifié la question d'attacher le code généré à ce jour. Je pense que la représentation de la sortie v [i] est en logarithme, une idée pour qu'elle puisse être représentée linéairement? Je ne sais pas si je suis sur la bonne voie, je suis désolé si ma question est très stupide mais je suis nouveau en C++. Merci beaucoup. –