【Python・音声信号処理初心者】
「研究でサンプリング周波数を揃えないといけない」
「機械学習に入力する際にデータを削減したい」
そんな方の疑問に答えます
コードが知りたい方は目次のソースコードへ飛んでください!
本記事のテーマ
【完全初心者向け】サンプリング周波数を1/2にする!
簡単ダウンサンプリング!
アルゴリズム
簡単ダウンサンプリング作成
1. 音声データを一つ飛ばしで格納していく
簡単ダウンサンプリング実装!
・モノラル音声の場合
←音声の長さを一つ飛ばしでループする
2. down_samp.append(sig[i])
←値を配列に格納
・ステレオ音声の場合
←音声の長さを一つ飛ばしでループする
2. down_samp_sig.append(sig[i])
←Lチャネルの値を配列に格納
3. down_samp_sig.append(sig[i+1])
←Rチャネルの値を配列に格納
code
# #モノラル音声の場合
# down_sanp_sig = []
# for i in range(0,len(sig), 2):
# down_samp_sig.append(sig[i])
#ステレオ音声の場合
down_samp_sig = []
for i in range(0,len(sig), 4):
down_samp_sig.down_samp_sig(sig[i])
down_samp_sig.append(sig[i+1])
fs = fs / 2
出力
サンプリング周波数 1/ 2の音声ファイルの生成!
完成です!
サンプリング周波数1/2の変換プログラムを実装しました。
サンプリング周波数の問題は研究をしていると結構出てきます。今はいろんなソフトがあるのでそちらでもサンプリング周波数を変換できますが、プログラミングで行うと大量のファイルを一回で変換できるので便利です!
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
+αの話
2のn乗のダウンサンプリングは同じ方法でできますが、1/3ダウンサンプリングになると難しいアルゴリズムが必要になってきます。検索してみて下さい!
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
main文を含むソースコードは以下に示します。
加えて、音声ファイルのopenやsaveの関数を書いた共通ソースコードは以下の記事に書いておりますので、実行ディレクトリ(ファイル名:sorce)の一つ上にフォルダ(ファイル名:common)を作成し、その中において下さい。
ソースコード
import sys
sys.path.append('../common') # 親ディレクトリのファイルをインポートするための設定
#sys.path.append('..')
import os
import glob
from sound import *
import numpy as np
from pylab import *
import matplotlib.pyplot as plt
if __name__ == "__main__" :
argvs = sys.argv
curDirPath = os.path.dirname(os.path.abspath(__file__))
wavDataPath = parentpath(__file__,1) + "/wav"
wavPathList = glob.glob(wavDataPath + "/*.wav")
print (curDirPath)
print (wavDataPath)
print(wavPathList)
filedata = openFile(wavPathList[0])
sig = filedata[0]
fs = filedata[1]
L = filedata[2]
for wavPath in wavPathList:
# #モノラル音声の場合
# down_sanp_sig = []
# for i in range(0,len(sig), 2):
# down_samp_sig.append(sig[i])
# fs = fs / 2
# filename_down_samp = wavPath.split("/")[-1].split(".")[0]
# print(filename_down_samp)
# saveFile(down_sanp_sig, fs, 16, filename_down_samp, 1)
#ステレオ音声の場合
down_samp_sig = []
for i in range(0,len(sig), 4):
down_samp_sig.down_samp_sig(sig[i])
down_samp_sig.append(sig[i+1])
fs = fs / 2
filename_down_samp = wavPath.split("/")[-1].split(".")[0]
print(filename_down_samp)
saveFile(down_sanp_sig, fs, 16, filename_down_samp, 2)