Oscillations and frequency spectrum through the Fourier transform

I am trying to find the vibrations and the frequency of the spectrum of the waveform generated by a vector of data representing the movement of a pixel in an image.

Data is saved in a .txt file as follows:

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 

The idea is to find the oscillation frequency (Hz) and the frequency spectrum (amplitude) of the graph obtained from the data, an example of the graph is given below.

example of the oscillation graph

I read a lot and talked a lot about using the fftw3 library for Fourier analysis, I am new to using C ++ and even most of this library.

Hope you can help me with code or ideas to solve my problem.

Many thanks for your help.

I am working with Microsoft Visual C ++ 2010 (win32)

the 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;
}
+4
1

, std::vector<double> in , : if (myfile.is_open()).

, , , , .

+2

Source: https://habr.com/ru/post/1675619/


All Articles