PCM の動作原理

現在位置のナビ

トップコンピュータの国雑記帳趣味趣味音響プログラムで学ぶディジタルオーディオ → PCM の動作原理

説明

ここでは PCM(Pulse Code Modulation) の解説をします。 PCM は、音波をディジタルで表現するときの基本と言っても良いでしょう。 CD や DAT などに音声を記録するときや、 光ケーブルで音声を伝送するときに使われます。

プログラム

動作環境ファイルサイズバージョン日付
unix & gtk+ viewer.tgz 波形表示プログラム 3,626 Byte 0.12004年7月13日
C 言語 filters.tgz 波形操作プログラム集 2,929 Byte 0.12004年7月13日

viewer は、ここで紹介するサンプルプログラムの出力を、 ウィンドウ画面上で波形として表示します。 オシロスコープのシミュレータと考えてもらってもかまいません。

filters には、波形データを操作するプログラムが入っています。 それぞれのプログラムは、実際に使いながら解説してゆきます。 将来ディジタルオーディオの解説が増えてゆくと、 filters の中身も増えてゆくことになります。

プログラムの試験

まずはプログラムを使ってみましょう。

% wave_gen >data1-1
% viewer data1-1

図1-1
図1-1

wave_gen プログラムをパラメータ無しで起動すると、5kHz の波形を出力します。 データを取り出す周期は、CDのサンプリング周波数 44.1kHz の1/16にしてあります。 つまりグラフの横1dot が 1.4μsec に相当します。

PCM の動作

data1-1 を PCM でディジタル化する様子を見てみましょう。

% pcm <data1-1 >data1-2
% viewer data1-2

図1-2
図1-2

PCM で1秒間に 44100 回波形を数値化します。 1回数値化すると、次の数値化まで同じ値が出てきます。 このグラフは横1dot が 1.4μsec ですから、 横に16dot 移動すると次の数値化が行われます。

PCM の誤差

data1-1 から data1-2 を引いて、PCM がつくり出す誤差を検討してみましょう。

% wave_diff data1-1 data1-2 >data1-3
% viewer data1-3

図1-3
図1-3

このように、PCM によって信号が階段状に整形すると、 元の信号と比較して細かい誤差が発生します。 この信号はノイズと言っても良いです。 このようなノイズを避けるため、PCM を出力する際は LPF(Low Pass Filter) を入れます。

LPF の出力

data1-2 に LPF をかけてみましょう。

% lpf <data1-2 >data1-4
% viewer data1-4

図1-4
図1-4

あらかじめ断っておきますが、 lpf コマンドで使っている LPF のプログラムは、 ディジタルオーディオで普通に使われる LPF ではありません。 解説プログラムという性格上、 ディジタルオーディオで採用されている方式を採用した方が良いのですが、 私自身ディジタルオーディオのフィルタはあまり作ったことがないので、 簡単な方式を採用しました。 方式は違っても LPF として動作する点に変わりは無いので、 かんべんしてください。

図1-4 ではほとんど data1-1 と同じ波形が出ていますね。 このように PCM 出力は LPF フィルタを通すことでほぼ元の波形になります。

LPF フィルタの作用を感覚的に表現すると、 波形の細かいギザギザを取ってなめらかにすることです。 技術的に表現すると高い周波数成分を減衰させて、 低い周波数成分を通す効果を持ちます。

PCM 信号をアナログに戻すところでは、みな LPF を通します。 アナログ出力を持った CD プレーヤー全てが LPF を持っているわけです。 基本的には D/A コンバーターの出力が図1-2 の波形になって、その直後にアナログ回路で LPF が入っています。

例外的にディジタルとアナログのLPF両方を持っているケースがあります。 ディジタルでの LPF は、 ここでの表現のように CD の周波数よりも高いサンプリング周波数に変換し、 ディジタル表現でまず高域成分を取ります。 ディジタル信号を高いサンプリング周波数に変換してあっても、 さらに高い周波数で見れば やはり階段状の信号になっていることに変わりはありません。 そこで、高目の周波数をカットするアナログ LPF を入れます。 なぜこのような2段組の仕掛けを用いるかと言うと、 アナログでの LPF が非常にクセのあるものだからです。 周波数が高くなるにしたがって緩やかに出力が弱くなっていく LPF は、 比較的簡単に作れます。 ところが、ある周波数より低い周波数は全部通しておきながら高い周波数になると突然出力が弱くなるような LPF は、 周波数特性に波が出たり、 周波数によって出てくる信号に遅れが発生したりして元の信号を変えてしまいます。 そこで、比較的クセの無いディジタルフィルタで途中の 22KHz 〜 160kHz あたりの周波数をカットしておいて、 次にアナログのフィルタで 160kHz 以上をカットします。 このアナログフィルタは 22kHz 〜 160kHz の部分では、 なだらかに出力が下がっていく特性でかまわないのです。

LPF の出力を入力と比較することは、一般に行われません。 その理由は、LPF によって信号入力から出力まで遅れが発生したり、 振幅が変化したり、遅れや振幅の変化が周波数によって異なっていたりするからです。

更新日

2004年7月13日 初出


back button プログラムで学ぶディジタルオーディオへ