![](https://watlab-blog.com/wp-content/uploads/2019/04/ec-wav-subset-304x165.png)
信号処理の基本であるwav波形の切り出しを習得します。wav波形といっても読み出しの時点でndarray形式になるため、NumPyの配列処理を使って説明します。
こんにちは。wat(@watlablog)です。
1つずつ確実に信号処理技術を習得していくために、今回は波形切り出しの方法を習得します!
波形切り出し方法
使用する波形
今回の説明に使用する波形は、前回wav読み込みで使用したものを使います。
前回のソースコードは以下の記事を参照下さい。
PythonのPySoundFileでwavファイル波形表示
そしてこちらがその波形。全長30s程度の音声ファイルです。ちなみにこの音声はグランドピアノのA(ラ)の鍵盤を最低音から最高音までオクターブ毎に叩いたものです。
波形分析するまでも無く、各鍵盤で減衰の仕方が違う等、面白い特徴があるのがわかりますね。
![波形](https://watlab-blog.com/wp-content/uploads/2019/04/wav-origin.png)
波形の情報取得
波形を切り出す前に、波形が持つ情報を整理しておきましょう。
波形切り出しで重要となる情報は配列の次元、サンプリングレート[Hz]と波形サイズ(何ポイントのデータ点があるのか)です。これらの情報は、以下のPythonプログラムで確認が可能です。
※サンプリングレートは前回のwav読み込み時に作成したsamplerateという変数に格納しているので、単に表示させているだけです。
※波形データはdataという変数に格納されています。このdataは波形読み込み時にndarrayという、NumPyパッケージで取り扱う配列形式にしています。
1 2 3 4 5 6 7 8 |
#配列次元を取得 print(data.ndim) #サンプリングレート[Hz]を取得(wav読み込み時に作成) print(samplerate) #波形サイズを取得 print(len(data)) |
波形読み込みと表示をさせたプログラムの中に上記コードを追記して実行することで、以下の実行結果を得ます。
1 2 3 |
1 44100 1367039 |
この結果から、
- 配列次元=「1」
- サンプリングレート=「44100」
- 波形サイズ=「1367039」
という情報を得ることができました。
次に、簡単に各情報の意味を図解したいと思います。
波形情報の図解
先ほどまで得られた情報を図を使って説明していきます。
今回の音声データのように時系列でデータ(計測器は実際には電圧を計測)を収集(サンプリング)する時は、通常一定の時間刻み幅\(dt\)で計測データ点を一つずつ記録していきます。
![](https://watlab-blog.com/wp-content/uploads/2019/04/sampling_theory.png)
グラフで見てしまうと連続した線になっているように錯覚してしまいますが、コンピュータで扱う実際の計測データは離散的な点に過ぎません。
そして、サンプリングレートとは、1秒間に計測するデータ数(つまり単位は[1/s=Hz])のことで、先ほど紹介した時間刻み幅とは逆数の関係にあります。
そしてこの時系列データ(時間波形)は時間の増分値に対応した一つの値を持っているため、その正体は1次元の配列データです。
※2次元配列には「画像」等の面データがあります。
今回の波形切り出しに必要な予備知識としては、以上で十分と思います。
配列から要素を抽出するコード
配列から任意の位置のデータを抽出するために、以下の構文を使います。
開始指標とは、配列のどの位置から抽出を開始するかを設定する項目です。この値は秒で指定するのではなく、何番目かを指定します。
終了指標は配列のどの位置まで抽出するかを設定する項目です。開始指標と同様に何番目かを指定します。
ステップは1を設定すると開始指標から終了指標までの全てのデータを抽出します。2であれば一つずつ飛ばしながら抽出と、間引き間隔を指定可能です。
1 2 |
#配列から任意位置のデータを抽出 配列[開始指標:終了指標:ステップ] |
以下に例として、今回の波形の抽出設定を示します。波形からは「〇秒から〇秒」を切り出したいので、最初にt_startとt_endで設定します。
4, 5行目は指標を算出しています。秒数を時間刻み幅で除すれば、その秒の指標が得られます。しかし除した結果は小数点を含む型ですので、int()文にて強制的に整数にしています(intはintegerの意味)。
1 2 3 4 5 6 7 |
dt = 1/samplerate #dt:時間刻み幅 t_start = 1.2 #開始時間 t_end = 7 #終了時間 index_start = int(t_start/dt) #開始時間の指標 index_end = int(t_end/dt) #終了時間の指標 data = data[index_start:index_end:1] #波形切り出し |
以下の画像が切り出し後の波形です。グランドピアノの打鍵一回分のみを抽出しました。最初の低音の部分です。初期のインパルスから次第に減衰していきますが、途中で再度盛り上がっているように見えますね。
![](https://watlab-blog.com/wp-content/uploads/2019/04/wav-subset.png)
まとめ
wavファイルから読み込んだ波形を任意の位置で抽出する方法を説明しました。
波形切り出しは全ての信号処理の基本ですので、おそらく今後も多用するものと予想されます。
切り出しの開始位置と終了位置は動的に決めることもできそうだね!
今後さらに分析を進める上でも役に立ちそうだぞ!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!
コメント