2017-04-25 7 views
4

私は画像内のピクセルの動きを表すデータのベクトルによって生成される波形の振動とスペクトル周波数を見つけようとしています。次のようにフーリエ変換による振動と周波数スペクトル

データは、.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; 
} 
+0

ようこそ。ここでのアイデアは、あなたが尋ねる前に頑張ろうとすることです。だから、あなたはこれまでに何を試していますか? – Walter

+0

https://stackoverflow.com/questions/32276728/plotting-frequency-spectrum-with-c これまでに生成されたコードを添付するための質問を編集しました。 出力v [i]の表現は対数であり、線形的に表現できるようにいくつかの考えがあると思いますか? 正しい軌道に乗っているかどうか分かりませんが、私の質問が非常にばかげていると申し訳ありませんが、私はC++を初めて使っています。 ありがとうございます。 –

答えて

2

あなたのコードの主な問題は、あなたがの範囲を離れるとき、変数std::vector<double> inが破壊されることがあります条件:if (myfile.is_open())

また、コードが入力ファイルから曲線を表す値を使用して、どのような方法ではないので、コードは、それが現在のレイアウトだ方法を与えられた振動の周波数を見つけることができる方法は本当にありません。

+0

私はC++とfftの新機能です。ナンセンスをしていれば申し訳ありませんが、これらのデータを変換する必要があります。簡単な説明や必要なものを実現するためのアイディアを手伝ってください。再度、ありがとうございます。 –

関連する問題