TERM GUIDE · DIGITAL

符号化

「符号化」とは

符号化(エンコード)とは、文字・数値・音声・画像などの情報を、決められた規則に従って、別の記号や数値の並びに変換することです。

コンピュータでは、情報を最終的に0と1の組合せで表すため、情報をビット列に変換する符号化が広く利用されています。

例えば、次のように曜日を3ビットの2進数で表すことができます。

曜日符号
月曜日000
火曜日001
水曜日010
木曜日011
金曜日100
土曜日101
日曜日110

ここでは、曜日と3ビットの符号を対応させる規則を決めています。この規則を共有していれば、符号から元の曜日を読み取ることもできます。

符号化したデータを、規則に従って元の情報に戻す処理を復号(デコード)といいます。

符号化は単に2進数へ変換することだけではありません。文字コードによる文字の表現、音声や画像のデジタル化、データ圧縮など、さまざまな場面で利用されています。

符号化に必要なビット数

コンピュータが扱う情報の最小単位はビット(bit)であり、1ビットでは0と1の2通りを表すことができます。

2ビットでは00、01、10、11の4通り、3ビットでは8通りを表せます。

一般に、nビットで表せる異なるパターンの数は、

2n 通り

です。

ビット数表せるパターン数
1ビット2通り
2ビット4通り
3ビット8通り
4ビット16通り
5ビット32通り
8ビット256通り
10ビット1024通り

したがって、N種類の情報を、すべて同じ長さのビット列で区別して表すためには、

2n ≧ N

を満たす最小の整数nを求めればよいです。

例えば、0から15までの整数は、0も数えるため全部で16種類あります。

  • 3ビットでは23=8通りなので不足します。
  • 4ビットでは24=16通りなので、ちょうど表せます。

実際に4ビットを使うと、0は0000、15は1111となり、0から15までの整数をすべて表せます。

ここで重要なのは、最大の数値ではなく、区別する必要がある情報の種類の数を考えることです。

例えば、0から100までの整数を区別する場合、必要なのは101種類です。26=64では不足し、27=128なら足りるので、最小7ビットとなります。

なお、このようにすべての情報を同じビット数で表す方法を固定長符号といいます。

組合せを2進数で符号化する

符号化では、一つの値だけでなく、複数の項目の組合せも表現できます。

例えば、四つのトッピングA、B、C、Dについて、それぞれを選ぶか選ばないかを考えます。

各トッピングには2通りの状態があるため、全体の組合せは、

24=16通り

となります。

ここで、Aに1、Bに2、Cに4、Dに8を割り当てます。

トッピング割り当てる値2進数
A10001
B20010
C40100
D81000

この割当てでは、選んだトッピングの数値を足し合わせるだけで、組合せを一意に表せます。

例えば、

  • AとCを選ぶ:1+4=5 → 0101
  • BとDを選ぶ:2+8=10 → 1010
  • すべて選ぶ:1+2+4+8=15 → 1111
  • 何も選ばない:0 → 0000

となります。

それぞれのビットが、トッピングを選んだかどうかに対応しています。

この方法で組合せを区別できるのは、割り当てた数値が1、2、4、8という2の累乗になっているからです。2進数の各桁が独立しており、異なる組合せが同じ合計になることがありません。

一方、1、2、3、4という数値を割り当てると、AとDを選んだ場合の合計1+4=5と、BとCを選んだ場合の合計2+3=5が同じになります。これでは合計値だけから元の組合せを特定できません。

このような符号化は、複数の設定のオン・オフを一つの整数にまとめる場合などにも利用されます。

音声や画像のデジタル化と符号化

現実世界の音声や光などは、連続的に変化するアナログ信号として扱われることが多いです。

コンピュータでこれらの情報を扱うためには、連続的な信号をデジタルデータに変換する必要があります。

基本的な処理の順序は、次のとおりです。

標本化 → 量子化 → 符号化

それぞれの工程には、異なる役割があります。

① 標本化(サンプリング)

アナログ信号から、一定の間隔で値を取り出す処理です。

音声の場合、連続的に変化する音の波形を、一定の時間間隔で測定します。

例えば、1秒間に8000回測定する場合、標本化周波数は8000Hz(8kHz)となります。

標本化によって、時間的に連続した音声信号から、各時点の振幅の値が得られます。

② 量子化

標本化によって取り出した値を、あらかじめ決められた有限個の段階に対応させる処理です。

例えば、測定された振幅が3.7であっても、整数の段階しか使用しない場合には、4などの近い値に置き換えます。

量子化では元の値を近似するため、一般に誤差が発生します。これを量子化誤差といいます。

段階数を増やすと、元の信号をより細かく表現できますが、各段階を区別するために必要なビット数も増えます。

例えば、8ビットで各段階を表すなら、

28=256段階

を区別できます。

③ 符号化

量子化された値を、0と1のビット列に対応させる処理です。

例えば、0から7までの8段階に量子化した値なら、3ビットの2進数000から111に対応させられます。

これによって、音声の情報をコンピュータで保存・処理・通信できるようになります。

このように、標本化は値を取り出す処理、量子化は値を有限段階にする処理、符号化は値をビット列に変換する処理です。

三つの工程を合わせたものがデジタル化であり、符号化はその一段階に当たります。

音声のPCM方式

音声をデジタル化する代表的な方式に、PCM(Pulse Code Modulation、パルス符号変調)があります。

PCM方式では、標本化、量子化、符号化の三つの工程によって、音声をビット列として表します。

非圧縮PCM音声の基本的なデータ量は、

データ量(ビット)=標本化周波数×量子化ビット数×チャンネル数×時間(秒)

で求められます。

例えば、標本化周波数8000Hz、量子化8ビット、モノラル(1チャンネル)の音声を5秒間記録すると、

8000×8×1×5=320000ビット

すなわち、40,000バイト(約40kB)の音声データになります。これは音声の標本データだけの量であり、ファイルの管理情報などは含みません。

画像のデジタル化

画像でも、標本化、量子化、符号化という考え方が使われます。

ただし、音声と画像では標本化する対象が異なります。

工程音声の場合画像の場合
標本化一定時間ごとに振幅を取り出す格子状の位置ごとに色や明るさを取り出す
量子化振幅を有限個の段階にする明るさや色の値を有限個の段階にする
符号化段階値をビット列にする各画素の値をビット列にする

画像では、標本化によって画素(ピクセル)ごとの情報を取り出します。

例えば、RGBの各色成分を8ビットで表す場合、各成分で256段階を区別できます。3成分で合計24ビットを使い、約1677万通りの色を表現できます。

一般に、画素数や階調数が増えるほど細かい画像表現ができますが、圧縮しない場合のデータ量も大きくなります。

文字の符号化と文字コード

コンピュータで文章を扱う場合も、文字を数値やビット列に変換する必要があります。

文字コードとは、文字と数値やバイト列との対応を定めるための仕組みです。

例えば、ASCIIでは、英大文字のAには10進数の65に相当する符号が割り当てられています。この値は2進数では01000001と表せます。

文字コードに関係する代表的な仕組みに、UnicodeとUTF-8があります。

UnicodeとUTF-8

Unicodeは、世界中のさまざまな文字を統一的に扱うための規格であり、各文字などにコードポイントと呼ばれる番号を割り当てています。

UTF-8は、そのUnicodeのコードポイントをバイト列で表す符号化方式の一つです。

UTF-8では、1文字のコードポイントを1~4バイトで表します。

  • ASCIIに含まれる英数字など:1バイト
  • 多くの日本語の文字:3バイト
  • 一部の絵文字など:4バイト

例えば、文字AはUTF-8では1バイト、日本語のあは3バイトで表されます。

UTF-8は可変長符号であり、すべての文字を同じバイト数で表すわけではありません。

そのため、同じ文字数の文章であっても、含まれる文字の種類によってデータ量が異なります。

なお、UTF-8ではASCIIに含まれる文字はASCIIと同じ1バイトの値で表されるため、ASCIIとの互換性があります。

文字化けが発生する理由

文字を正しく復号するためには、送信側と受信側で、符号化方式について共通の理解が必要です。

例えば、送信側がある文字コードで文章をバイト列に変換したのに、受信側が別の文字コードとして解釈すると、元の文字とは異なる文字が表示される場合があります。

これが文字化けです。

文字コードによっては、文字とバイト列の対応だけでなく、文字を区切る方法も異なります。

したがって、単に文字数やバイト列だけが分かっていても、使用された符号化方式が不明であれば、元の文章を正しく復元できるとは限りません。

固定長符号と可変長符号

符号化には、すべての情報を同じ長さで表す固定長符号のほかに、情報によって異なる長さの符号を割り当てる可変長符号があります。

例えば、A、B、Cという三つの記号を固定長符号で表す場合、2ビットずつ割り当てればよいです。

記号固定長符号
A00
B01
C10

しかし、Aが非常によく出現し、Cがほとんど出現しないなら、すべての記号に2ビットを使うことが効率的とは限りません。

そこで、出現しやすい記号に短い符号を割り当てます。

記号出現確率可変長符号符号長
A0.601ビット
B0.3102ビット
C0.1112ビット

この場合、Aを1ビットで表せるので、平均的なデータ量を小さくできます。

平均符号長

可変長符号の効率を考えるときには、平均符号長を利用します。

平均符号長とは、各記号の出現確率に符号長を掛けたものの合計です。

平均符号長=Σ(出現確率×符号長)

先ほどの例では、

L=0.6×1+0.3×2+0.1×2
=0.6+0.6+0.2
=1.4ビット

となります。

固定長符号では1記号当たり2ビット必要だったのに対し、可変長符号では平均1.4ビットで表せます。

このように、記号の出現確率に応じて符号の長さを変えることで、データを効率よく表現できます。

接頭語自由符号

可変長符号では、符号の長さが異なるため、連結したビット列をどこで区切るかが問題になります。

例えば、Aを0、Bを01とすると、最初の0を読んだ時点では、Aが確定したのか、Bの途中なのかを判断できません。

そこで、区切り記号を使わず、左から順に符号を確定できるようにする方法があります。

その代表的なものが接頭語自由符号(プレフィックス符号)です。

接頭語とは、符号の先頭部分のことです。

接頭語自由符号では、どの符号語も、ほかの符号語の接頭語にならないようにします。

例えば、次の符号語を考えます。

0、10、110、111

これらは、どの符号語もほかの符号語の先頭部分と一致しません。

例えば、010110111というビット列は、

0 | 10 | 110 | 111

と、左から順に区切って復号できます。

出現確率の高い記号に短い符号を割り当てるハフマン符号も、接頭語自由符号を利用する代表的な符号化方法です。

符号化とデータ圧縮

データ圧縮とは、情報の表し方を工夫して、保存や通信に必要なデータ量を削減することです。

圧縮でも符号化の技術が利用されます。

圧縮には、大きく分けて可逆圧縮と非可逆圧縮があります。

可逆圧縮

圧縮したデータから、元のデータを完全に復元できる方式です。

代表的な方法の一つが、ランレングス法(連長圧縮)です。

例えば、次のように同じ記号が連続するデータを考えます。

AAAAAABBBBCCC

これを、記号と連続回数の組で、

(A,6) (B,4) (C,3)

と表します。

このように、同じ値が長く続くデータでは、連続する値をまとめて記録することで、データ量を削減できる場合があります。

一方、値が毎回変化するデータでは、まとめられる部分が少なくなり、圧縮効果は小さくなります。

例えば、PCM方式で記録した音声について、すべての標本が同じ値となる無音区間なら、長い繰返しをまとめて表せるため、ランレングス法との相性がよいです。

これに対して、不規則に値が変化するホワイトノイズや、標本値が頻繁に変わる音声では、同じ値が連続しにくいため、ランレングス法による圧縮は効きにくくなります。

なお、実際の圧縮後のデータ量は、連続回数を記録する方法などにも左右されます。圧縮方法とデータの特徴が合わなければ、圧縮後のほうが大きくなる場合もあります。

非可逆圧縮

非可逆圧縮とは、一部の情報を削減することでデータ量を小さくする方式です。

元のデータを完全には復元できませんが、人間が知覚しにくい情報などを削減することで、比較的少ないデータ量でも実用的な品質を保てます。

JPEG画像や、多くの動画圧縮方式などで利用されています。

EXAMPLE

例題

符号化 · EXAMPLEオリジナル

整数0から15までの16種類を、全て同じ長さの2進数で符号化する。必要な最小ビット数を次から選べ。

  1. 0

    3ビット

  2. 1

    4ビット

  3. 2

    8ビット

  4. 3

    15ビット

解答・解説を確認

正解1.4ビット

解説

N種類を固定長で表すには2n≧Nとなる最小のnビットが必要です。0を含む16種類は0000~1111の4ビットでちょうど表せます。

出典
オリジナル

PRACTICE

符号化の問題に挑戦