So-net無料ブログ作成
検索選択

scilab で fft [Math]

前回の正弦波を fft してみた。
fft の分解能は サンプリング周波数/サンプルの数 だそうで、
今回は 44100 Hz/1024=約43.1Hz
なので、 430 Hz のデータが最大なので、そこから + 43.1 した
430 〜 473 Hz の範囲が最大なんじゃないかと。であれば 440Hz
はこの範囲なのであってるなと。

sinwave_fft.png

scilab スクリプトはこんな感じ。
funcprot(0);
clear all;

//////////////////////////////////////////////////////////////////////
// parameters
//////////////////////////////////////////////////////////////////////
sampleNum = 1024;   // sample number
sampleFreq = 44100; // sampling frequency
waveFreq = 440;     // wave frequency

//////////////////////////////////////////////////////////////////////
// main
//////////////////////////////////////////////////////////////////////
// create time-axis
ts = [0:sampleNum] * 1/sampleFreq;
// create sin wave
f=sin(2 * %pi * waveFreq * ts);
// data number of data for fft
N = sampleNum/2;
// create freq-axis
fs = [0:sampleNum] * sampleFreq/sampleNum;
// fft
f_fft = fft(f);
power = f_fft.*conj(f_fft);

subplot(211);
plot2d(ts,f);
title = sprintf("A %dHz wave is sampled with sampling rate=%dHz",waveFreq,sampleFreq);
xtitle(title,"time (sec)","arbitral");

subplot(212);
plot2d("nl",fs(1:N),power(1:N));
xtitle("powerspectrum", "frequency(Hz)", "arbitral");

[maxPower,maxIndex] = max(abs(power(1:N)));
maxFreq=fs(maxIndex);
printf("max frequency range=%f~%f\n",maxFreq, maxFreq + sampleFreq/sampleNum);



nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。