(PDF:223KB)音声情報

12
音声情報 (オーディオ、サウンド) のデジタル処理
• 音の情報
• 応用
通信:電話、TV 電話、インターネット電話
放送:TV, CATV, CS
蓄積:音楽用 CD, DAT, DV, DVD
合成:コンピュータミュージック (シンセサイザー)
12.1
12.1.1
音の性質
音波の特徴付け
• 音波とその伝播
• リバーブレーション
直接音、初期反射音、残響 (図 1)
図 1: 音の伝わり方
• 音のパラメータ
1
– 周期 T (sec)、周波数 f (Hz) T= :音の高低
f
– 一定の音 周期的な音圧パターン
– 音圧(振幅)
:音の大きさ
– 波形:音色
• 音圧
– 圧力 P a = N/m2
– 大気圧= 1.013 × 105 P a = 1 気圧
– 通常の音圧= 10−5 気圧 気圧が 1.00001∼0.99999 で変動
• アンプリチュードエンベロープ(図 2,3)
– 振幅の時間的変化
– 音色の性格付け(アタック、デケイ、サステイン、リリース)
1
図 3: バイオリンのエンベロープ
図 2: ギターのエンベロープ
12.1.2
重ね合わせ
• 純音:単一の周波数成分からなる正弦波による音
• 振幅 A, 周波数 f , 初期位相角 φ
f (t) = A sin(2πf t + φ)
= A sin(ωt + φ)
ω = 2πf 角周波数
例) 440Hz の純音は A の音 (ラ)
• 複雑な音波も単純な波形 (正弦波、周波数成分) に分解できる。
例) 鋸波(図 4)。
• うなり
周波数の少し異なる違う正弦波の重ね合わせ (図 5)
f (t) = sin(2πf1 t) + sin(2πf2 t) = 2 sin(2πt(f1 + f2 )/2)
例)
· cos(2πt(f1 − f2 )/2)
うなりの周波数
2
3
6
図 5: うなり現象
図 4: 6 倍音までを加えて鋸波を作る例
• 音波の解析 → 周波数成分の解析
• 帯域:音の周波数スペクトルの上下限
12.2
音の知覚
• 聴覚
音波が耳に達すると、鼓膜が音波と同様なパターンで振動し、中耳で増幅され、
内耳の蝸牛にある規定膜で神経に伝わる電気的なパルス信号となる。この信号
が、大脳の聴覚中枢に伝わる (図 6)。
2
図 6: 耳の構造
• 可聴範囲
周波数範囲:16Hz から 25000Hz まで
音圧の範囲:10−3 ∼10−9 気圧 最小 P0 = 2 × 10−5 N/m2
• 耳の鼓膜の振幅= 10−8 mm (水素原子の直径の
1
)
10
• 音の強さと大きさ
rR
– 実効音圧:1周期の平均音圧
P =
a(t)2 dt
T
– 音圧の単位(音圧レベル (SPL))
聞き取れる最小音圧 P0 = 2 × 10−5 N/m2 に対する自乗比の対数表示
µ ¶
µ 2¶
P
P
=
20
log
(dB, デシベル)
Lp = 10 log10
10
P02
P0
– 等ラウドネス曲線
周波数によって、同じ音圧の音でも違った大きさに聞こえる (等ラウドネ
ス特性)。1000Hz の純音を聞かせ、各周波数でそれと同じ大きさに聞こえ
るところをプロットした曲線 (図 7)
– 最小可聴限
各周波数において、聞くことのできる最低の音圧レベル
図 7: 等ラウドネス曲線(一番下の曲線の下の領域は聞こえないところ。120dB 以上
は苦痛。)
3
– ホン (phon)
人間が知覚する音の大きさを表すのに使われる単位。70 ホンは 1,000Hz
の 70(dB) の音の強さのレベルを意味する。
12.3
DSP(Digital Signal Processing, デジタル信号処理)
12.3.1
A/D 変換
• アナログ波形 (図 8)
マイクロフォンによって音圧波形を電圧波形信号に変換
アナログ信号:連続な時間軸に対する (ある範囲の) 音圧 (電圧値) の関数
• A/D 変換 (ADC)
コンピュータ処理を行うために、
(1) 一定の間隔で信号値を取る:標本化、サンプリング
(2) 信号値を離散的な数値に置き換える:量子化 (quatization)
デジタル信号:結果として得られる一定時間間隔の数値の列
• サンプリング
アナログ波形の振幅の瞬時値を、一定時間間隔に測定
入力波形に、時間幅が狭く大きさが1のパルス波 (理想的には σ 関数) を、一定
時間毎に掛ける (図 8)。
• サンプリング間隔 (周期)∆t
サンプリング周波数 (Sr )=1 秒間のサンプリング回数=
1
(Hz)
∆t
• サンプリング信号 xc (i)
図 8: サンプリングとサンプリング波形
12.3.2
シャノンの標本化定理とエイリアス
• 連続信号を間引いてもいいのか?⇒サンプリング周波数を元の連続信号に含ま
れる最高の周波数 f の 2 倍以上に設定すれば、元の音を再現できる。
2f < Sr
•
1
2 Sr
をナイキスト周波数という。
• エイリアス (折り返し現象)
図 9 は、横軸に周波数をとり、縦軸に周波数に対する信号強度をとったもので、
信号のスペクトル分布を表している。サンプリングされた波形はパルス状(実
4
際には、微小幅の矩形波)で、そのような角張った波形は、図 4 の鋸波でみた
ように、高い周波数の波を無限に重ね合わせたものなので、サンプリング波形
も、そのような(原信号には含まれない)高い周波数の成分を含むことになる。
図 9 では、左側の山が原信号の周波数成分に対応し、その右側の山が、この高
い周波数成分に相当する。この山は繰り返し無限に現れる。
• 図 10(上) のように、右側の山は、ちょうどナイキスト周波数( 12 Sr 、サンプリ
ング周波数の 21 )を対称軸として軸対称に現れる。そこで、もしも原信号がナ
イキスト周波数よりも大きい周波数 f の成分を含んでいると、それが周波数
Sr − f のところに現れ、原信号に重なってしまう (図 10(下))。
• エイリアシング (折り返し現象)
一般に、原信号がナイキスト周波数よりも高い周波数 f の成分を含むとき (本
来原信号に含まれていない) 周波数:
fa = kSr ± f (k = 1, 2, 3, . . .)
の成分が原信号の領域に含まれてしまう現象 (図 10)
• アンチエイリアシングフィルター (ローパスフィルター)
サンプリング周波数 Sr を設定したら、サンプリングを行う前にナイキスト周
波数 21 Sr 以上の周波数成分をフィルターで除去してから (図 11) サンプリング
する。
12.3.3
(線形) 量子化
• サンプリングされたアナログ値をあるビット数の整数値に近似 (図 12)
サンプル値 xc (i) に対して
µ
s(i) = round
xc (i)
Q
¶
ここで、Q は量子化間隔 (量子化ステップ) で、round(·) は四捨五入による整
数化である。
例)
• 量子化ビット数 n
xc が次の範囲に入るように、n と Q を選ぶ。
−Q2n−1 ≦ xc (i) ≦ Q2n−1
−2n−1 ≦ s(i) ≦ 2n−1
例)
• 量子化ビット数 n とすると、信号値の幅は Q2n 。
12.3.4
量子化誤差、量子化雑音
• 逆量子化 (復号化)
量子化信号から元の信号を復号する第1歩は、
x(i) = Qs(i)
例)
• 量子化誤差 |x(i) − xc (i)|
• 最大量子化誤差:
Q
2
5
図 9: サンプリングによって発生する高周波数成分
f
1/2 Sr
Sr - f
f
Sr - f
Sr
Sr
1/2 Sr
図 10: エイリアシング
1/2 Sr
1/2 Sr
図 11: ローパスフィルタ
6
Q
図 12: 量子化
• 量子化雑音
量子化誤差は、音を再生するとノイズとなる。
• ダイナミックレンジ:装置の量子化ノイズと最大の音圧の (自乗) 比
• ダイナミックレンジの計算式 (図 13)
D = 10log(V 2 /(V /2n )2 ) = 20log2n = 20nlog2 = 6.02n
2V
V
V
2V/(2^n-1) =:= 2V/2^n=V/2^(n-1)
V/2^n
0
-V
図 13: ダイナミックレンジ
• 例)
音楽用 CD, 16 ビット⇒ 97.8dB
DVD, 24bit ⇒ 145.8dB
コンサートホールのオーケストラ⇒約 90dB
12.3.5
D/A 変換
• D/A 変換 (DAC)
デジタル信号から、アナログ信号を生成
7
1. デジタル信号から階段状の波形を生成 (図 14)
サンプルホールド回路、あるいは、デグリッジ回路
階段状の波形は、高周波成分を含んでいる。
2. ローパスフィルターによって高周波成分をカットすると元の波形になる。
図 14: D/A 変換
12.3.6
まとめ
アナログ信号 → ローパスフィルタ → 標本化 → 量子化 → デジタル信号 →D/A→
ローパスフィルタ → アナログ信号
12.4
音声情報の符号化
• CODEC(Compression & Decompression, COder & DECoder) 符号器・復号器
• 各種の方式がある。
12.4.1
PCM(Pulse Code Modulation) パルス符号変調
• A/D 変換されたサンプルデータの列で表現。圧縮なし。
例) 音楽用 CD
サンプリング周波数 44.1 KHz
帯域:0∼22.05KHz、量子化ビット数 16 ビット、
74 分の音楽= 16 ビット × 44100 回/秒 × 60 秒/分 × 74 分 × 2 (ステレオ)
÷ 8 ビット/バイト= 783,216,000 ≈780 Mbyte
ビット転送レート:サンプリング周波数 Sr × 量子化ビット数 n = 705.4Kbps
• プログラム例(本節の最後に添付)
12.4.2
DPCM(Differential PCM) 差分パルス符号変調
• 信号の差分だけを記録する。
• 変化が穏やかな場合、隣り合った信号の差は大きくないので、信号のレベル自
体よりも差分だけを伝えるほうが情報量は少ない。
8
12.4.3
予測符号化
• これを一般化したのが予測符号化 (図 15,16)
• 予測には、その時点までの m 個のデータの線形結合を用いる。
a1 , . . . , am :予測係数
x̂(i) = a1 x̃(i − 1) + a2 x̃(i − 2) + . . . + am x̃(i − m):予測値
d(i) = xc (i) − x̂(i):差分 (予測誤差)
s(i) = d(i) を量子化
x̃(i − 1) = i 個めに (逆量子化後に) 出力される信号)
• m = 1, a1 = 1 の場合が DPCM
d(i)
図 15: DPCM
-
i=i+1
+
+
図 16: DPCM
• 前後するサンプル値には強い相関関係があり、s(i) は 0 の付近に集中し、分散
も小さい。⇒ s(i) に対して Huffman 符号化をかけてさらに圧縮
• ADPCM(Adaptive DPCM) 適応型差分パルス符号変調
入力信号の性質に応じて、予測係数の調整を行う。
12.4.4
その他
• 知覚符号化 (聴覚心理符号化)
周波数成分に分解し、可聴域外の細部を省略:lossy な圧縮。
例) MPEG2/Audio NBC
帯域:20KHz、64Kbps、40MB/stereo・60 分
9
64
= 1.45)
(PCM の 1.5 ビット/sample 相当、16 × 705.4
←PCM 帯域:20.05KHz, 705.4Kbps (16 × 44.1)
参考文献
コンピュータミュージック、岩竹、オーム社、ISBN4-274-12960-8
10
// sineau.java
// 正弦波の au ファイルを生成する。
public static void main(String arg[])
// エンコーディングは次の仕様に固定
{
// サンプリングレート 8kHz、データ長 8 ビット、モノラル、PCM
int i;
// (C) 鈴木宏正@東京大学 1999/9/3
// オリジナルは
// for (i = 0; i < arg.length; i++)
// http://urd.naklab.dnj.ynu.ac.jp/~komachi/java/doc/wavtoau.java (JAVA のソース)
//{
// http://urd.naklab.dnj.ynu.ac.jp/~komachi/java/doc/wavtoau.class (JAVA アプリケーショ
// System.out.println(arg[i]);
ン)
//}
// http://urd.naklab.dnj.ynu.ac.jp/~komachi/java/doc/wavtoau.html (ページ)
// 引数の数のチェック
// 関連プログラム
if ((arg.length < 3)|| (arg.length > 3))
// http://www2s.biglobe.ne.jp/~satosi/soft/index.html
{
// http://www2s.biglobe.ne.jp/~satosi/soft/wav2auCnv/wav2auCnv.txt
usage();
return;
import java.io.*;
}
import java.lang.Math;
else
{
class sineau
// 引数のパージング
{
String aufile;
static void usage()
int freq, len;
{
int l;
System.out.println("Usage: makeau 440 5 file.au");
// 周波数
System.out.println("(440Hz (int), 5sec (int), output file name.");
System.out.println("8000Hz/8bit/mono");
try
{
}
freq = Integer.parseInt(arg[0]);
static void tobyte(int i, byte b[])
}
{
catch (Exception e)
// int から byte への変換
{
b[0] = (byte) ((i >> 24) & 0xff);
System.out.println("argument must be interger:"+arg[0]);
b[1] = (byte) ((i >> 16) & 0xff);
return;
b[2] = (byte) ((i >> 8) & 0xff);
}
b[3] = (byte) (i & 0xff);
}
// 長さ
try
static void generate(int freq, int len, String auname)
{
{
len = Integer.parseInt(arg[1]);
FileOutputStream fout;
}
catch (Exception e)
{
try
System.out.println("argument must be integer:"+arg[1]);
{
return;
fout = new FileOutputStream(auname);
}
}
catch(Exception e)
{
// ファイル名
System.out.println(auname + " cannot create");
l = arg[2].lastIndexOf(".");
return;
if (l >= 0)
}
{
aufile = arg[2].substring(0, l) + ".au";
try
}
{
else
// ファイル生成
{
// ヘッダー部(24 バイト固定+ 任意長コメント)
aufile = arg[2] + ".au";
// ここではコメント長を 8 としている。
}
// マジックナンバー ".snd"
byte b[] = {0x2e, 0x73, 0x6e, 0x64}; // {’.’, ’s’, ’n’, ’d’}
fout.write(b); // 1
generate(freq, len, aufile);
}
}
// データ開始位置(ヘッダーの長さ= 32)
tobyte(32, b);
fout.write(b); // 2
}
// データサイズ (8000 sample/sec * ユーザー指定の時間)
int size = 8000*len; // 5 seconds
tobyte(size, b);
fout.write(b); // 3
// エンコーディングタイプ 2: 8-bit linear PCM
tobyte(2, b);
fout.write(b); // 4
// サンプリングレート 8kH = 8000
tobyte(8000, b);
fout.write(b); // 5
// チャネル数(モノラル 1)
tobyte(1, b);
fout.write(b); // 6
// コメント
byte b0[] = {0, 0, 0, 0};
fout.write(b0); // 7
fout.write(b0); // 8
// データ (8bit, signed, [-128, 127])
int u;
for (u = 0; u < size; u++)
{
// ユーザーが指定した周波数の正弦波を生成
double a = 2.0*Math.PI*freq/8000.0;
// 2*pi*f/8000
fout.write((byte)(126*Math.sin(a*u)));
}
fout.close();
System.out.println(auname + " ... created");
}
catch (Exception e)
{
System.out.println("file write error");
}
}
11