私は画像内のピクセルの動きを表すデータのベクトルによって生成される波形の振動とスペクトル周波数を見つけようとしています。次のようにフーリエ変換による振動と周波数スペクトル
データは、.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)と周波数スペクトル(振幅)を見つけることです、グラフの一例を以下に示す。
私が読んで、フーリエ解析のための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;
}
ようこそ。ここでのアイデアは、あなたが尋ねる前に頑張ろうとすることです。だから、あなたはこれまでに何を試していますか? – Walter
https://stackoverflow.com/questions/32276728/plotting-frequency-spectrum-with-c これまでに生成されたコードを添付するための質問を編集しました。 出力v [i]の表現は対数であり、線形的に表現できるようにいくつかの考えがあると思いますか? 正しい軌道に乗っているかどうか分かりませんが、私の質問が非常にばかげていると申し訳ありませんが、私はC++を初めて使っています。 ありがとうございます。 –