(2019年1月28日 Julia 1.1に対応)
using FileIO: load import LibSndFile using FFTW using Plots pyplot(); # リコーダー吹鳴音の読み込み、冒頭から1.8秒分だけ使う # (基音が約524Hzの吹奏音が入っている) y = load("recorder.flac"); fs = y.samplerate; y1 = y[1:Int(fs*1.8)]; # 2の累乗になるようにzero-padding y2 = zeros(nextpow(2, length(y1))); y2[1:length(y1)] = y1; # フーリエ変換して絶対値を計算し、2乗してパワーにする Y2 = abs.(fft(y2)) / length(y2); Y2 = Y2 .^ 2; # 正の周波数成分と負の周波数成分をまとめる # (DCからナイキストまでの範囲(正)だけを抽出し、 # 捨ててしまった負の部分を補正するために2倍する) Y3 = Y2[1 : Int(length(Y2)/2) + 1]; Y3[2:end-1] = Y3[2:end-1] * 2.0; # デシベルに変換 Y4 = 10 * log10.(Y3); # 各ビンの周波数を計算 f = range(0, stop=y.samplerate/2, length=length(Y3)); # ここまでで、fとY4に各ビンの周波数とパワーが入った # グラフ描画 plot(f, Y4 .- maximum(Y4), # 最大値が0 dBになるようにして描画 xlim=(0, 15000), ylim=(-80, +3), # X軸・Y軸の範囲指定 grid=true, # グリッドを表示 legend=false, # 凡例を表示しない title="Power Spectrum", # タイトルや軸のラベルを付ける xlabel="Frequency (Hz)", ylabel="Power (dB)"); savefig("output.png"); # PNGファイルへの保存 savefig("output.pdf"); # PDFファイルへの保存
↓こんなのが出てくる。