Smile Engineering blog ( スマイルエンジニアリング・ブログ )

ジェイエスピーからTipsや技術特集、プロジェクト物語を発信します

サンプリング周波数とビットレート

2018-07-20 10:00:00 | JSP-knowledge

前回オーディオファイルについて書きましたが、ファイルサイズを小さくする(ビットレートを低くして符号化する)と音質が悪くなる傾向にあります。実際どのくらいにするのが良いのでしょうか。。。

オーディオ符号化(AACやMP3など)により圧縮された場合、エンコード時のビットレートで圧縮率が決まります。具体的には、低いビットレートを設定すれば圧縮率は高くなり、保存した時のファイルサイズが小さくなりますが、そもそも圧縮なしの元の音源(PCM)の場合はどのくらいのビットレートなのでしょうか?
PCMのまま保存すれば原音の音質になりますが、ファイルサイズを気にせずに保存するのはちょっと都合が悪かったりします。また、用途によっては原音のサイズでも十分にメモリ容量があったり、通信速度が大丈夫な世の中になってきた気もします。そこでデジタルオーディオでよく耳にするサンプリング周波数と、ビットレートについて書きたいと思います。

デジタルオーディオのビットレートは、サンプリング周波数と1サンプルに割り当てられるビット数( 量子化ビット数 )、チャネル数(ステレオやモノラルなど)で決まります。

  • PCM(圧縮なし)のビットレート = サンプリング周波数 × 量子化ビット数 × チャネル数

前回も少し書きましたが、例えばwavフォーマットやmp4などファイルコンテナでは、これらの情報がヘッダとして付いていますので、アプリケーションではヘッダを見て再生することができます。エンコードの圧縮率は、このPCM(圧縮なし)のビットレートに対しエンコード時に指定したビットレートで決まります。
例えば音楽CDはご存知の方が多いと思いますが、44.1kHzのステレオで、これは次のビットレートになります。

  • 音楽CDのビットレート:44100Hz × 16bit × 2ch(ステレオ) = 1,411.2kbps

これをMP3やAAC等でエンコードする場合は、当然1,411.2kbpsより小さいビットレートを指定することになります。例えば256kbpsでエンコードした場合、圧縮率は原音を100%とした場合、約18%でファイルサイズは1/5以下になります。

  • 音楽CDを256kbpsでエンコード:256kbps / 1,411.2kbps = 約18%

実際にPCに接続されるオーディオデバイスのサンプリング周波数としては、一般的に音楽では48kHz, 44.1kHzが多く、マイクやヘッドセットなど音声では16kHz, 8kHz、この他にも32kHz, 24kHz, 22.05kHz等色々あります。

量子化ビット数16bitのPCM(圧縮なしの音源)のビットレートは次になります。

ステレオ(音楽向け)PCM16bitのビットレート(例)

サンプリング周波数量子化ビット数チャネル数ビットレート備考
48kHz 16 2 1,536 kbps  
44.1kHz 16 2 1,411.2 kbps 音楽CD
32kHz 16 2 1,024 kbps  
24kHz 16 2 768 kbps  
22.05kHz 16 2 705.6 kbps  

モノラル(音声向け)PCM16bitのビットレート(例)

サンプリング周波数量子化ビット数チャネル数ビットレート備考
32kHz 16 1 512 kbps Super wide band
24kHz 16 1 384 kbps  
16kHz 16 1 256 kbps Wide band
8kHz 16 1 128 kbps Narrow band



サンプリング周波数(Sampling frequency)

webを参照すると、アナログ波形をデジタル変換にするために必要な標本化(サンプリング)などの説明があります。例えば、マイクなどから入力した音声信号を1秒間に何サンプル採ってデジタル化するかを示したもので、大きいほど高い音域まで記録できます。アナログ波形をデジタル化した時、表せる周波数はサンプリング周波数の1/2になります(サンプリング定理)。例えば、サンプリング周波数48kHzでは、24kHzまで表現できることになります。音声でよく使われる8kHz(Narrow band)や、16kHz(Wide band)では、それぞれ、4kHz, 8kHzまでしか聞こえません。サンプリング周波数が高くなるとビットレートも上がる関係にあります。

サンプリング定理

ものすごく簡単な説明ですが、サンプリング周波数の半分の周波数まで表現できます。信号をサンプリングするとき、その間隔が細かければ元の信号に近く復元できますが、粗すぎると復元できなくなります(信号処理の話とか別の機会にもう少し詳しく書ければと思います)。

44.1kHz

なぜ44.1という、区切りが悪いレートが採用されているのでしょうか。。。
技術者の間では、わざとめんどくさいクロックにして、音楽CDを簡単にコピーさせないようにしたのではないか? みたいなことを聞いたことがあります。検索すると、大昔のPCMレコーダの都合でこうなった(?)らしいです。今の時代になっては、開発において44.1kHzは何かにつけ苦労します。44.1kHz ↔ 48kHz のサンプリング変換なんかは頭を悩ませます。例えばUSBオーディオ(USB Audio Device Class)は1ms間隔でデータをやり取りします。48kHzの場合48サンプルのデータになりますが、44.1kHzを考えた時は、10msで44サンプル(×9)と、45サンプル(×1)みたいなことになってしまいます。45サンプルの時の1サンプルをごまかすと(あくまで仮に)、44.0kHzになります。音声や音楽ではそれっぽくなり、人間の耳は大体ごまかせると思っています(あくまで個人的な意見です)。
しかし、客観的な評価方法ではすぐにバレます。例えば正弦波(sin波)とかで、はっきりとごまかしたことが分かります(意外に世の中に出回っているかも)。



量子化ビット数

サンプリング(標本化)が時間方向に値を取ること(離散化)でしたが、量子化とは振幅方向に値を取ることです。音の大きさを示すのに可能な範囲(レンジ)で、よく耳にするもので「ダイナミックレンジ96dB」とかは、量子化ビット数16bitを意味するもので0~65535の範囲で音楽信号を再現できます。量子化ビット数は、ビット深度とかbit depthとも言われます。



ビットレート(Bitrate)

通信においては、時間当たりに何ビットのデータが転送されるかを示すもので、一般的には1秒間に何ビット転送(処理)されるかというbps(bit/s)で表します。低ければファイルとして保存する時のサイズは小さく、通信でも伝送路に余裕ができます。例えば1つの音声(1チャネル)を1/3に圧縮した時は、同ビットレートで3チャネル分の音声を送れることになります。古い話で恐縮ですがアナログで通信していた(アナログ携帯電話)時代から考えると、デジタル化+圧縮することで、同じ電波で複数の通話をサポートできることになります。

最後に

ハイレゾ( High-Resolution Audio)といものをよく耳にします。サンプリング周波数が48kHzを超えた96kHzとか192kHzとか、量子化ビット数が24bitとか、、、人間の聴覚の限界(高域)が20kHzくらいと言われていますが、それ以上の周波数まで表現していることになります。ひと昔前の画像並なビットレートですね。。。
ちなみに、犬は60kHz猫は64kHzくらいまで聞こえるらしいです。

ハイレゾ( High-Resolution Audio)の例

サンプリング周波数量子化ビット数チャネル数ビットレート表現できる周波数
192kHz 24 2 9,216 kbps 96kHz
192kHz 16 2 6,144 kbps 96kHz
96kHz 24 2 4,608 kbps 48kHz
96kHz 16 2 3,072 kbps 48kHz
48kHz 24 2 2,304 kbps 24kHz

人間の聴覚の限界(20kHzくらい)を考えたとき、サンプリング定理でいうと、48kHzとか44.1kHzで十分な周波数になるのですが、皆さんはいかがでしょうか。。。
私の場合とてもハイレゾの高域を聞き分けることはできませんが、48kHzで捨てられた周波数が96kHzでは再現できてるはずで、量子化ビット数も24bitのレンジになると、何となく音圧(dB)がほんの少し上がってるように感じるかな(?)くらいの感覚です(あくまで私の耳のはなしです)。
機会があれば比較をしてみたいところですが、耳では恐らくそれなりな再生器機(高価なアナログアンプとか)が無いと分からないような気がします。

音響の業界では、ついに検証をにやってもらう時代が来ているのでしょうか。。。

 

monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

ASSE/CORPA
  センサー、IoT、ビッグデータを活用して新たな価値を創造
  「できたらいいな」を「できる」に

OSGi対応 ECHONET Lite ミドルウェア
  短納期HEMS開発をサポート!

GuruPlug
  カードサイズ スマートサーバ

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(monipet)、それに農業も手がけるIT企業

コメント

Google Test 備忘録

2018-06-29 18:00:00 | JSP-knowledge

はじめに

Google Test は Google 製の C++ Test Framework です。
導入については良質な解説ページがいくらでもあるので省略、ここではいつのまにか忘れてしまう事柄や、実際に使用して得た知見を備忘のために残します。

備忘録

テストケース名、テスト名について

どちらも有効な C++ の識別子でなければならず、アンダースコア(_)を使用してはいけません。Google Test ではテストの名前解決のためにアンダースコア(_)を用いて名前を連結しており、ユーザがこれに干渉するのを避けるためです。よって、テストケース名、テスト名は必然的に Camel Case(Pascal Case)となります。

参考: なぜ,テストケース名やテスト名にアンダースコアを利用してはいけないのでしょうか?

テストを一時的に無効にする

テストに DISABLED_ プレフィックスをつけることにより、テストを一時的に無効化することができます。これはテストケースにも有効です。テストケース名はすなわちテストフィクチャ(クラス)名ですので昨今の IDE であれば rename 機能で属するテストを一括で無効化できます。

テスト実行後に DISABLED なテスト(実行しなかったテスト)がレポートされるので、#if 0 で無効化するよりも安全です。

参考: テストを一時的に無効にする

メッセージ出力

ユーザ定義の失敗メッセージを出力するには、 <<演算子 を用いてメッセージをストリームに出力します。

メッセージ出力の例:

ASSERT_EQ(x.size(), y.size()) << "Vectors x and y are of unequal length"; for (int i = 0; i < x.size(); ++i) { EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i; } 

明示的な成功と失敗

FAIL() は致命的な失敗を生成します。ADD_FAILURE() および ADD_FAILURE_AT() は致命的ではない失敗を生成します。プログラムの制御フローによって成功/失敗を判断するときに使用します。

制御フローによって判断する例:

switch(expression) { case 1: ... some checks ... case 2: ... some other checks ... default: FAIL() << "We shouldn't get here."; 

SUCCEED() は成功を生成します。テスト全体を成功させるわけではなく、テスト実行時にそこに含まれるすべてのアサーションが失敗しなかった場合にのみ、そのテスト全体が成功したとみなします。

参考: 明示的な成功と失敗

Private メンバのテスト

private なクラスメンバはそのクラスや friend クラスからのみアクセス可能です。クラスの private メンバにアクセスするにはテストフィクスチャをそのクラスの friend に宣言して、フィクスチャクラスにアクセサを定義します。

実装例:

#ifdef WITH_GTEST #include"gtest/gtest_prod.h" #endif template <class T, int N=10> class Stack { T data_[N]; int index_; #ifdef WITH_GTEST friend class StackTestF; #endif ... 
class StackTestF : public ::testing::Test { protected: template <class T> autoget_index(T& s){ return s.index_; } ... 

参考: Private クラスメンバ

テストの部分的な実行

デフォルトでは、Google Test はユーザが定義したすべてのテストを実行します。GTEST_FILTER 環境変数、または --gtest_filter フラグでフィルタ文字列を設定するとこれにマッチしたテストケース、テストを実行します。

フラグ(フィルタ文字列)の指定例:

参考: テストの部分的な実行ヘルプを表示するサポートされているフラグと使い方の一覧をみるにはテストプログラムに --help フラグをつけて実行します。

フラグ(フィルタ文字列)説明
./foo_test フラグの指定なし。すべてのテストを実行する
./foo_test —gtest_filter=* * は任意の文字列にマッチ。すべてのテストを実行する
./foo_test —gtest_filter=FooTest.* テストケース FooTest 内の全てのテストを実行する
./foo_test —gtest_filter=*Null*:*Constructor* 完全な名前に "NULL"、または "Constructor" を含むテストを全て実行する
./foo_test —gtest_filter=-*DeathTest.* Death テスト 以外 を実行する
./foo_test —gtest_filter=FooTest.*-FooTest.Bar テストケース FooTest 内の全てのテストを実行する。ただし、FooTest.Bar は除く


monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

ASSE/CORPA
  センサー、IoT、ビッグデータを活用して新たな価値を創造
  「できたらいいな」を「できる」に

OSGi対応 ECHONET Lite ミドルウェア
  短納期HEMS開発をサポート!

GuruPlug
  カードサイズ スマートサーバ

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(monipet)、それに農業も手がけるIT企業

コメント

Continuing story of elementary mathematics

2018-06-29 18:00:00 | JSP-knowledge

Continuing story of elementary mathematics

そもそも補数ってなんなのよ

基本情報でよく出てくる2の補数とか1の補数なんて単語がでてくるけど、そもそも補数というのは何なのか?
Wikipediaを見ると

補数(ほすう;complement)とは、ある基数法において、ある自然数 a に足したとき桁が1つ上がる(桁が1つ増える)数のうち最も小さい数をいう。
b 進法において、自然数 a を表現するのに必要な最小の桁数を n としたとき、

  • n − a を 「b 進法における a に対する基数の補数(b の補数)」
  • n − a − 1 を「b 進法における a に対する減基数の補数(b - 1 の補数)」

という。 → Wikipedia

と書いてある。
コンピュータで使っているのは2進数なので

  • 2 n − a を 「2 進法における a に対する基数の補数(2 の補数)」
  • 2 n − a − 1 を「2 進法における a に対する減基数の補数(2 - 1 の補数、即ち1の補数)

ということになる。これが10進数だったら

  • 10 n − a を 「10 進法における a に対する基数の補数(10 の補数)」
  • 10 n − a − 1 を「10 進法における a に対する減基数の補数(10 - 1 の補数、即ち9の補数)

になるわけ。2進数での補数は2の補数(基数の補数)と1の補数(減基数の補数)、10進数での補数は10の補数(基数の補数)と9の補数(減基数の補数)といった具合に各基数に対して2種類の補数があるそうな。

この補数を使うと引き算を足し算にできたり、負数を表現できたりとか、何か色々良いことがあるらしいが、どうも今一つピンとこない。試験の時に一生懸命暗記してもすぐ忘れてしまう。そもそも、キチンと理解していないのがいけない。
という訳で今回から数回に分けて補数(やそれにまつわる話)について掘り下げてみる。

補数についてもう少し考える

上の定義にあるように補数自体は基数(何進数、ということ)をいくつに選んでもよい、ということでしばらくは10進数で考えよう。あと、2種類の補数、基数の補数と減基数の補数があるがこれもしばらくは基数の補数(10進数なら10の補数、2進数なら2の補数)だけを考える。

では10進数での0~9の自然数の補数を調べてみる。上の定義から
  10 n − a
1桁だからnは1
  10  − a
  = 10 − a n − a


だから

a10の補数
10
... ...


まぁ、これは簡単。次、10進数での0~99の補数は
  10 n − a
2桁だからnは2
  10  − a
  = 100 − a
だから

a10の補数
100
99
98
... ...
92
91
10 90
11 89
12 88
... ...
98
99


となる。ん・・・、0から9は1桁だから
  10  − a
で計算しなきゃいけないんじゃないの?
と、思ってしまうが違うんだな。補数の計算は最大桁数の設定が大事。補数の定義にあるnのことね。2桁で補数演算を行う、としたら1桁の値が出てきてもnを2として計算する。
これ大事。忘れないでね。

 

引き算を足し算にできるらしい

たとえばx-yを補数を使って足し算にする場合、基数をb、最大桁数をnとすると

  • xにyの補数を足す。
  • その結果からb nを引く

とする。
ここで最大桁数とは減数、または被減数のうち桁数の多いほうの桁数のこと。

 

10進数の場合、基数の補数の定義から桁数をnとしたときのyの補数は
  10 n - y
だからx - yを補数を使った足し算で表すと
  x + ( 10 n - y ) - 10 n
となる。整理すると
  x - y + 10 n - 10 n
  =x - y
となって確かに引き算を足し算で行っている。
でもなんか当たり前だよな。ちょっとがっかり。

 

今回はここまで。
次回はこの補数を使った演算をもう少し詳しく見てみよう。

 

monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

ASSE/CORPA
  センサー、IoT、ビッグデータを活用して新たな価値を創造
  「できたらいいな」を「できる」に

OSGi対応 ECHONET Lite ミドルウェア
  短納期HEMS開発をサポート!

GuruPlug
  カードサイズ スマートサーバ

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(monipet)、それに農業も手がけるIT企業

コメント

データ分析手法(クロス集計・決定木)

2018-06-13 10:00:00 | JSP-knowledge

アンケート調査によく利用される分析手法であり、アンケートの回答に性別や年代といった回答者の属性項目を交えて集計するデータ分析手法です。
エクセルなどの表計算ソフトでも、手軽にクロスする項目を選定して集計結果を得ることが可能です。

「ある商品に対して、購入者全体の70%の人が満足していたが、満足度に男女差があり、男性では満足している人の割合が30%と低かった」といったように、設問の回答傾向を、別の設問の回答別に細分化して見ることができるため、異なるグループ間での回答傾向の比較が可能になります。

以下は、全国の 60 歳以上の男女を調査対象にした
「どの程度生きがい(喜びや楽しみ)を感じているか」のクロス集計の例
image-20180606081935727.png
出典:内閣府ホームページの「平成25年度 高齢者の地域社会への参加に関する意識調査結果」を加工して作成

あらかじめ立てた仮説を検証したり、回答の傾向から新たな仮説を見つけ出すことをクロス集計分析によって行うことが出来ます。

決定木分析

ディシジョン・ツリーとも呼ばれており、アンケート結果などを基にツリー構造の図を作り、分岐点ごとにクロス集計を繰り返して偏りが最も大きくなる分岐条件を見つけ出す分析手法です。
「影響の強い要因」の把握と「要因の組み合わせ」を把握することができます。

例えば、年齢別、性別などの項目で樹形図を作り、どのような属性の人が購入志向が高いかを探ることができます。
以下、「ある商品の購入志向」の決定木分析の例
image-20180607102131571.png

決定木分析は、さまざまな業種、業態で活用されています。
例えば、金融機関の取引履歴から顧客属性別の貸し倒れリスクを測ったり、機器の動作ログから故障につながる指標を見つけ出したりといったことに決定木分析が利用されています。

 

monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

ASSE/CORPA
  センサー、IoT、ビッグデータを活用して新たな価値を創造
  「できたらいいな」を「できる」に

OSGi対応 ECHONET Lite ミドルウェア
  短納期HEMS開発をサポート!

GuruPlug
  カードサイズ スマートサーバ

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(monipet)、それに農業も手がけるIT企業

コメント

オーディオファイル(フォーマット)

2018-06-12 10:00:00 | JSP-knowledge

音に関する技術やツールの話をお伝えしたいと思います。今回は、音声や音楽再生で使用されるオーディオファイル(フォーマット)について、ご存知の方も多いと思いますが、ほんの少し技術の話も交えて書いてみたいと思います。代表的なところでは、MP3, AAC, WMAなどがあります。

  • *.mp3
  • *.aac
  • *.wma

これらはオーディオ符号化規格の名前が拡張子になっています。

規格名内容
MP3 MPEG-2 Audio Layer 3
AAC Advanced Audio Coding (MPEG-2/4 Audio)
WMA Windows Media Audio

AAC用のファイルコンテナとしては、ADIF, ADTSもあります。

  • *.adif
  • *.adts
形式AAC用のコンテナ備考
ADIF Audio Data Interchange Format 先頭にヘッダ(蓄積系)
ADTS Audio Data Transport Stream フレーム毎にヘッダ(放送系)

あと思いつくところでは、wav(wave)やaiff。

  • *.wav
  • *.aiff

WAV、AIFFは、一般的にはリニアPCM(Pules Code Moduation)の場合が多いようですが、エンコードされたビットストリームも格納できるみたいです。

形式ファイルコンテナ備考
WAV Wave File Format (RIFF waveform Audio Format) Windows
AIFF Audio Interchange File Format Mac OS

画像も含まれますがmp4, 3gppなど、こちらはメディアを格納するコンテナファイルです。

  • *.mp4
  • *.3gpp

MP4は、説明するまでもなく動画コンテンツ等で使用されていますが、例えばH.264とAACのような組み合わせで格納されています。また、MP4はMPEG-4規格そのものではなく、MPEG-4規格の一部でファイルコンテナのフォーマットであり、*.mp4ファイルの中身はそのヘッダで表されたメディアが格納されていますので、例えばMPEG-1やMPEG-2も格納できます(MPEG規格以外も格納できますH.263、G.729とか)。
ちなみに、MPEGはISO/IEC、H.263はITU-Tになります。ITU-TのH.264も当然格納できますが、H.264は、MPEG-4 AVCとも呼ばれ、ITU-TとISO/IECの共同で策定したため同じ技術で呼び方が2個あります。ISO/IECとITU-Tでアルゴリズム的にはほぼ同じ技術でも規格として別になると互換性がなくなってしまいます。H.264とMPEG-4 AVCのように規格としても互換があるのは使う側からすると大変ありがたいと思います(ちょっと、映像の話になってしまいました)。

形式画像も含めて(映像/音声の多重)
MP4 MPEG-4規格の一部でメディアファイルフォーマット(ファイルコンテナ)
AVI Audio Video Interleave
3GPP 3GPP(Third Generation Partnership Project)が定めたファイルフォーマット

3GPPも映像/音声のファイルコンテナで、こちらはAMR(Adaptive Multi Rate)が音声で使われることがあります。

規格名規格サンプリング周波数
AMR-NB Adaptive Multi Rate Narrowband 8kHz
AMR-WB Adaptive Multi Rate Wideband 16kHz

 

AMR

AMR(Adaptive Multi Rate)は、音声通信(携帯電話)向けの低レートの音声符号化規格です。ビットレートは、AMR-NBで4.75kbps~12.2kbpsの8種類のレート(modeと呼ばれるもの)があります。MP3やAACに比べると音声を目的にしているので、かなり低ビットレートで圧縮率が高いです。例えば、カラオケBOXにいる友達から電話がかかってきた時、声はまあまあ聞こえても流れている音楽の音質が非常に悪く感じた経験はないでしょうか。音声コーデックの通信がワイドバンドでサンプリング周波数16kHz(この時点で8kHz以上の音は聞こえません)、なおかつ低ビットレート(音声通信を目的にしている、ACELPという方式)の合成音のため、音楽の質はかなり悪くなります。
最近の高品質なものでは、EVS(Enhanced Voice Services)というものがあます。私も標準化に向けての色々を少しだけ経験しました。

 

MP3

MPEG-2 Audio Layer-3です。mp4ファイルやMPEG-2/4などの規格があるので、何となくMPEG-3では?
と思った人がいるかも知れませんが、MP3はMPEG-2です。"3"は、Layer-3 なんですね。DVDとかでMPEG-2の場合オーディオはmp3が多いです。
MP3で検索するとアルゴリズムとしては、フィルターバンク(FB)、MDCT聴覚心理ハフマン符号化、、、というキーワードが出てきます。フィルターバンク(FB)は簡単に言うと帯域分割、MDCTは、FFT高速フーリエ変換)を聞いてピンとくる人なら分かると思いますが、時間領域から周波数帯域への変換で、私の記憶では、窓を半分ずつ重ねて変換を行っているようなイメージでした。聴覚心理は、例えば、ある周波数の音が大きい時、人間の耳にはその隣接した周波数の音は聞こえにくいということを利用して、エンコードする時に省いてしまってもバレないだろうみたいなアルゴリズムだった記憶しています。ハフマン符号化は良く知られていますが、データの出現率によって圧縮するものだと思っています。処理の順番としてはこんな感じで、実際には並行して別の処理もあるのでかなり大雑把な流れのイメージです。

  • エンコード: PCM ➞ 時間領域の処理 ➞ FB ➞ MDCT ➞ 周波数分析や色々 ➞ 量子化 ➞ ハフマンエンコード
  • デコード: ハフマンデコード ➞ 逆量子化 ➞ 周波数領域で色々 ➞ IMDCT ➞ 時間領域の処理 ➞ PCM

IMDCT逆MDCTの意味で、FFTに対してのIFFTと同じ意味です。MDCTIMDCT), FFTIFFT)はデジタル信号処理の話になりますので、別の機会に何か書きたいと思います。

 

AAC

AAC(Advanced Audio Coding) は、MPEG-2 AACとこの技術を引き継いだ MPEG-4 AACがあり、私は、MPEG-2 AACのLC(Low Complexity)プロファイルのエンコーダ/デコーダをやったことがあります。おおざっぱには、MP3と同様にMPEGのAudio規格でオーディオ符号化で、MDCTを使ってます。MP3の後継なのでMP3と同条件(ビットレート)では、AACの方が品質が良いと言われてます(地デジとか)。例えば、MP3がステレオまでに対し、5.1チャネルとか最大48チャネルまで対応しています。

 

WMA

Windows Medioa Audioは、バージョンがかなりあり、私が携わったものはWMAの初期だったと思うのですが、バージョンが何だったか思い出せません。アルゴリズム的にはMP3やAACと同様なMDCTでした。 .wmv(Windows Media Video) の動画で、WMVと組み合わせて使用されています。例えば編集した動画の保存はみなさん何を選択されるのでしょうか。多くの方はMP4でしょうか。。。Windowsをメインに考えるのな ら、WMV(オーディオはWMA)もありかも知れません(互換性はともかく)。

 

WAV

私はウェブと呼んでいますが、最近はワブと呼ぶ人が多いですね(webと区別する意味でしょうか。。。)ファイルコンテナなので、中身はヘッダに書いてある音源が格納されていますが、ほぼリニアPCMですね(圧縮されてません)。たまに24bitのPCMとか、5.1chとかありましたがPCMでした。圧縮(符号化)されたものは記憶にないです。従ってファイルサイズはこれが一番大きくなりますが、圧縮しないので保存したり再生する処理は一番早く、音質もデジタル変換(ADC)された元の音です。
(もしかしたら、リニアPCM以外に、μ-Law, a-Lawなど8bitは、あるのかも知れません)

 

PCM

音響分野の業界では一番使っていると思います。WAVの中に入っている raw data のバイナリで、WAVヘッダが付いてないものです。なので、再生する時はサンプリング周波数とチャネル数が分かってないと再生できません。例えば、自分で再生ツールに48kHzとかステレオとか設定して再生することになります。めんどくさいですね。。。でもこれが一番シンプルなので実はありがたいです。ヘッダが付いているとヘッダ解析する必要があるためです。

  

最後に

ここに紹介しました音声・オーディオ符号化(WAV以外)は、PCMを符号化(エンコード)したもので、復号化(デコード)再生では、もとのPCMには戻りません(非可逆圧縮)。 ここ近年では、可逆圧縮のコーデックも研究され(ロスレスオーディオ)、例えばMPEG-4 ALSなどがあります。当然圧縮率は低いですが。。。
紹介できなかったものもたくさんあると思います。例えば、Ogg, Opusなどがありますが、今回は経験がなく紹介することができませんでした(勉強します)。

 

 

monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

ASSE/CORPA
  センサー、IoT、ビッグデータを活用して新たな価値を創造
  「できたらいいな」を「できる」に

OSGi対応 ECHONET Lite ミドルウェア
  短納期HEMS開発をサポート!

GuruPlug
  カードサイズ スマートサーバ

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(monipet)、それに農業も手がけるIT企業

コメント