スペクトログラムからデータを取り出す方法について

2 views (last 30 days)
K0144
K0144 on 19 Mar 2021
Commented: takemoto on 30 Mar 2021
現在、MATLABを用いて倍音についての研究を行っている高校生です。採取した音のデータをMATLABに取り込みスペクトログラムとして表示することは出来ました。この後いくつかの楽器の音や音程によるスペクトログラムの比較を行いたいと考えています。そこでデータを定量的に比較したいのですが図示したスペクトログラムから座標を取り出す方法が分かりません。その方法について知りたいです。MATLABは使い始めた程度でプログラムについてあまり詳しくないので詳しく教えていただけるとありがたいです。

Accepted Answer

takemoto
takemoto on 22 Mar 2021
spectrogramという関数をお使いなら、実行時に時間と周波数の情報を獲得できますので、それを利用してはいかがでしょうか?例えば、スペクトログラムの最大値をとる座標(時間と周波数の値)を得たければ、以下の様に書けそうです。
load mtlb
[~,f,t,p] = spectrogram(mtlb,100,80,100,Fs);
surf(t,f,10*log10(p),'edgecolor','none'),view([0,90]);
[C,I] = max(10*log10(p(:)));
[ii,jj] = ind2sub(size(p),I);
fmax = f(ii)
tmax = t(jj)
pmax = 10*log10(p(ii,jj))
hold on
plot3(tmax,fmax,pmax,'r*')
hold off
  2 Comments
K0144
K0144 on 22 Mar 2021
ありがとうございます。この回答を参考にしたところ値を取ることが出来ました。
取り出したところで一つ質問なのですが図示したスペクトログラムでは音の値は パワー/周波数(dB/Hz) となっています。元の値に10*log10(p)をするとそれに変換できる意味やパワー周波数の意味について数値を比較するうえで必要な部分だけでも教えていただけないでしょうか。
重ねての質問で申し訳ありませんがよろしくお願いします。
takemoto
takemoto on 30 Mar 2021
ご紹介した例で得られる"p"は、パワースペクトル密度です。周波数による除算により、信号の単位周波数当たりのパワーを求めています。10*log10(p)の演算は、デシベルへの換算です。デシベル換算により、パワーを対数軸で観測することになり、「ノイズ」と「信号」等、対象信号に微小な信号と大きな信号が混在する様なケースで、双方を効率よく観測できる、というメリットがあります。

Sign in to comment.

More Answers (0)

Categories

Find more on 時間-周波数解析 in Help Center and File Exchange

Products


Release

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!