MATLABで音声処理その2:音声ファイルの解析(時系列波形の表示とFFTで周波数スペクトル表示)

投稿日:2022年9月23日
最終更新日:2022年9月23日

MATLABで音声ファイルを解析

今回は、前回つくったwavファイルを題材にして、MATLABの機能を使って音声データを解析してみる。具体的には、時系列のオーディオデータの振幅波形を表示させたり、FFT(高速フーリエ変換)で周波数スペクトルを表示させたりしてみる。

ちなみにwavファイルは先日RaspberryPiでやった電子オルゴールの動画から音声だけ取り出したもの。

【電子工作】パッシブブザーをPWM制御して電子オルゴールをつくってみる(Raspberry Pi 4で遊ぼう日記 その17)

取り出した音声データが以下のもの。

 

開発環境

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の記事は以下にまとめてます。

MATLAB/Simulinkで遊んでみる まとめ

 


投稿者: wakky

映画と旅行が大好きなエンジニア。お酒、ゲーム、読書も好き。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください