Posts Issued on January 17, 2024

posted by sakurai on January 17, 2024 #735

サウンドミキサーの仕様

8bit符号無し$\dagger$のwave形式のサウンドを4多重して16bit符号付きに変換するサウンドミキサーを作成します。

  • 入力: 4チャンネルch0~3のwave(PCM, 11.025KHz、8bit、Mono、メタデータ無し)
  • 出力: 1チャンネルwave(PCM, 11.025KHz、16bit、Mono、メタデータ無し)

まず8bit符号無し数を加算操作を行うために8bitの2の補数表現に変換します。それにはゲタ8'h80を引き算する必要があります。しかしながら、引き算はコストが高いため、MSBの反転を行います。以下にそれで良いことをChatGPTに証明してもらいました。

8bitゲタ履き数を8bitの2の補数表現に変換するにはゲタを引き算するのが常道ですが、MSBの反転でも良いことを数学的に証明してください。

ChatGPT:

8ビットの「ゲタ履き数」(8'h80がゼロとされる特殊な表現)を8ビットの2の補数表現に変換する際に、MSBのみを反転する方法が等価であることを証明します。

特殊な表現

この表現では、8'h80がゼロとされます。したがって、この表現における任意の値 $V$は、標準的な2の補数表現における値 $V'$ に$128$(あるいは2進数で$1000\,0000_2 $)を加えたものとして表現されます。

つまり、$V = V' + 128$ または$ V = V' + 1000\,0000_2$。

2の補数表現への変換

通常の2の補数表現へ変換するには、特殊な表現から128($1000\,0000_2$)を引きます。

$V' = V - 128$または$V' = V - 1000\,0000_2$

MSBの反転

MSBを反転するということは、数値から$1000\,0000_2$(128)を引くか、加えることと等価です。なぜなら、MSBが1の場合は1を0に反転(-128する)、MSBが0の場合は0を1に反転(+128する)からです。

したがって、MSBの反転は以下の操作に等しいです:

  • MSBが1の場合(つまり $V$が128以上の場合)、$ V' = V - 1000\,0000_2 $。
  • MSBが0の場合(つまり $V$が127以下の場合)、$ V' = V + 1000\,0000_2$。

証明

MSBの反転が128の加算または減算と等価であることを考えると、この操作は常に特殊な表現を標準的な2の補数表現に変換します。

  • $V $が128以上の場合、MSBは1です。したがって、MSBを反転すると$ V - 128 $になります。これは2の補数表現における負の値に相当します。
  • $V $が127以下の場合、MSBは0です。したがって、MSBを反転すると $V + 128$になります。しかし、$ V $が127以下であるため、この加算はオーバーフローを引き起こし、結果として128を引くことになります。これは2の補数表現における正の値に相当します。

したがって、MSBのみを反転する操作は、特殊な8ビットの「ゲタ履き数」を標準的な8ビットの2の補数表現に変換するための有効な方法であることが証明されます。


$\dagger$:符号無しの定義は0以上の正の整数のみを扱うデータ型であるため、正しくはゲタ(8'h80)履き数


左矢前のブログ 次のブログ右矢