MATLABで音声ファイルを解析
今回は、前回つくったwavファイルを題材にして、MATLABの機能を使って音声データを解析してみる。具体的には、時系列のオーディオデータの振幅波形を表示させたり、FFT(高速フーリエ変換)で周波数スペクトルを表示させたりしてみる。
ちなみにwavファイルは先日RaspberryPiでやった電子オルゴールの動画から音声だけ取り出したもの。
取り出した音声データが以下のもの。
開発環境
MATLAB online
MATLAB R2022a
wavファイルをaudioreadで読み込む
まずは前回保存したwavファイルをaudioreadで読みこみ、オーディオデータy、サンプルレートFsをワークスペースに保存する。
[y,Fs] = audioread('buzzer_march.wav');
今回のオーディオデータは48kHzでサンプリングされた23秒程度のデータとなる。
音声データを時系列波形で表示
まずは横軸に時間、縦軸に振幅を表示させて、オーディオデータの音が大きく出ている部分や、音のレベルの差などを確認してみる。縦軸はそのままyを使えばよいが、横軸の時間xは、以下のようにyのデータ数とサンプリング周波数Fsから算出した行列を使う。
N = length(y); x = [1:N]/Fs;
これでグラフに表示するデータはそろったので、以下のコマンドでプロットしてグラフを表示させる。
plot(x,y); xlabel('time[s]'); ylabel('Amplitude');
以下が表示させてみたグラフ。このオーディオデータではラズベリーパイに「子犬のマーチ」を演奏させているのだが、出している音によってレベルが結構異なるようだ(「レ」の音を出しているところのレベルが高かったりとか)。自分の耳ではよくわからなかった部分なので、可視化してみるとなかなか面白い。
音声データをFFT(高速フーリエ変換)して周波数スペクトル表示
次はオーディオデータyをFFTで変換して、周波スペクトルを表示してみる。周波数スペクトルの表示は参考文献を参考にして、以下のコマンドで実行した
S = abs(fft(y)); K = length(S); x_freq = [1:K/2]/K*Fs; y_freq = S(1:K/2); plot(x_freq, y_freq); xlabel('Frequency[Hz]'); ylabel('Amplitude');
以下が変換してみた結果。5000kHz以下にほとんどのピークが集中している。
これじゃよくわからんので、5500Hz以下あたりにズームインしてみる。このグラフを見ると4000Hz~5000Hzあたりにピークが集中している。
私はオーディオに関しては素人ではあるが、時系列波形や周波数スペクトルから、なんとなくデータの特徴を掴むことはできた。次回は素人なりにMATLABの機能を使ってノイズの除去などをやってみようと思う。
参考文献
公式ドキュメントと以下の本を読みつつ色々試しています。
MATLAB/Simulink記事まとめ
MATLABとSimulinkの記事は以下にまとめてます。