2017-04-25 4 views
4

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.

example of the oscillation graph

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; 
} 
+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

+0

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. –

Répondre

2

Le principal problème avec votre code est qui sera détruit la std::vector<double> in variable lorsque vous quittez le cadre de la conditionnel: if (myfile.is_open()).

également le code est en aucune façon en utilisant les valeurs représentant la courbe à partir du fichier d'entrée, donc il n'y a vraiment aucun moyen le code pourrait trouver fréquence d'oscillation donné la façon dont il est actuellement aménagé.

+0

Je suis nouveau en C++ et fft, désolé si je fais un non-sens mais j'ai besoin de faire cette transformation pour ces données .... pourrait m'aider avec une explication plus simple ou avec des idées pour accomplir ce dont j'ai besoin. Encore, merci beaucoup. –