FC2ブログ

子供の落書き帳 Remix

15/4/13:ひと月に一度更新するブログになってしまっている

音声処理ソフトAudacityでのディザ適用の条件とビット深度について
2018/01/28(日) 23:52:58


そもそもディザとは何か


ディザとは、ディジタル音声信号を処理するときに、信号に人工的に付加される微小なノイズのことである。
ビットの深度が減少する処理の際に、量子化エラー(丸め誤差)が起きるのを防止する。量子化エラー(丸め誤差)が周期的に発生すると、特定の種類の音が現れる可能性があり、それを防ぐために微小なノイズを付加する。

audacityにおけるビット深度 (bit depth)


audacityに特有の話に移る。
audacityで音声の取り扱うときに、ビット深度(bit depth)をいくつにして処理するか。これは32bit float, 24bit, 16bitの3つの選択肢がある。
[編集]→[設定]の画面を開いて、「品質」タブを選択する。「サンプル形式」という選択項目がビット深度を表わしている。
設定値は以下の画像がデフォルトである。
Audacity設定画面デフォルト

Audacityのヘルプでは下記の通り、32bit floatを推奨している。32bitだけがfloat(浮動小数点数)なのがポイントである。他の2つは固定小数点数であり、小さな数を表現するときに精度が大幅に落ちる危険性がある(詳しい説明は省く)。

The Audacity default quality settings are Sample Format 32-bit float (and Sample Rate 44100 Hz). It is strongly recommended that you use these settings unless you have good reasons to deviate from these. 32-bit float is chosen to give an extremely low noise floor and to provide good headroom to avoid sound distortion even when performing heavy editing and manipulation of the audio.
拙訳:Audacityのデフォルトの品質設定は、32-bit float(とサンプリング周波数44100Hz)である。これらの設定から逸脱する正当な理由が無い限り、これらの設定を使用することを強く推奨する。 音声を何度も編集し操作したときでも、非常に低いノイズフロアと充分なヘッドルームが得られるため、32-bit floatが選択されている。

ノイズフロアは特定の量子化の方式を使用する上で発生するノイズを指す模様、下記リンクを参照。
偏ったDTM用語辞典 - ノイズフロア:Noise Floorとは - DTM / MIDI 用語の意味・解説 | g200kg Music & Software

Audacityではどのようなときにディザが実行されるか?


基本的には、音声信号のビット深度が下がるときには、設定に従ってディザリングが実行される。
「ビット深度が下がるとき」というのは、具体的には以下の3つの場合だ。

・音声を再生するとき (正確には、再生時にAudacity内のデータと、再生時のサウンドカードのビット深度を比較して、後者が少ない場合)
・音声をエクスポートする際にビット深度が下がるとき (例えば、32-bit floatや24bitのプロジェクトで処理をしていて、16bit形式でファイルにエクスポートするとき)
・16bitもしくは24bitのプロジェクトで、音声の編集処理を実施する場合

3番目については説明が必要だろう。例えば16bit信号に対して編集を行う場合、

16bit信号→編集→16bit信号

であるから、一見するとビット深度の低下は起こらない。しかしながら、Audacity内部では編集時に32bit floatに一旦数値を変換している。したがって、編集処理はこうなる。

16bit信号→32bit float信号→編集→32bit float信号→★16bit 信号

最後の★のところで、信号のビット深度が下がっているため、ディザリングが実行されているというわけだ。
16bit信号に対して何度か編集処理をすると、そのたびにディザリングが実行されてしまう。ディザリング自体は微小なノイズだが、何度も実行していると「ちりも積もれば山となる」で大きなノイズになり、音声品質の劣化につながるだろう。Audacity公式が「32bit floatを使うのを推奨」と言っている理由は、このあたりであると推測される。

実例 ~矩形波~


ディザの実例を見てみよう。
「品質」の設定はデフォルトのままである。
ジェネレータで「矩形波、エイリアス成分なし」を選んで、振幅0.001、周波数440Hzの矩形波を生成した。縦軸を適度に拡大すると以下のようになる。矩形波の上下の部分が一直線になっていることに注意。
2018-01-28_2317.png

[書き出し]→[Export as wav]で「WAV 16bit PCM 符号あり」形式で保存。この時、エクスポートする際にビット深度が下がったので、ディザリングが実行されたはずである。保存したwavファイルを再度開いてみると、以下のようになる。
2018-01-28_2319.png

上下の線がギザギザになってしまった! これは、ディザが実行されたためである。各サンプルに微小なノイズを加算したので、一直線にはならない。サンプルが見える程度まで拡大すると、以下のようになる。サンプルごとにノイズが付加されて、違う値になっていることが分かる。
2018-01-28_2336.png

(ディザのノイズレベルは一定なので、もとの信号が小さいときにはS/N比が悪くなる。今回はディザリングの影響を分かりやすくするため、矩形波のレベルをわざと小さくしている)

ディザリングが実行されないようにしたい場合はどう設定するか?



音声処理をする上で、特定の16bit PCM音源(例えば正弦波とか……)が必要になってAudacityで作成するという場合もあるだろう。
気をつけるべきは、デフォルトの設定だとディザによるノイズが重畳されるということである。
例えば「16bit PCM形式で、周波数880Hzの正弦波を生成したい」と言っても、完璧に正確な正弦波は生成不可能だ(量子化によるエラーが生じるため)。量子化に対して「周期的な量子化エラー(丸め誤差)が生じてもよいから、16bitにおいて一番近い数にしたい」という場合もあるだろう。この場合はディザを避けなければならない。あるいは「周期的な量子化エラー(丸め誤差)は嫌なので、ディザを乗せよう」という場合もあるだろう。上記のうちどちらの音声を生成したいのかを考えて、適切な設定を選ぶ必要がある。
デフォルトの設定のままだとディザが実行されるので、後者の音ができあがる。

では前者の「周期的な量子化エラー(丸め誤差)が生じてもよいから、16bitにおいて一番近い数にしたい」場合はどうすれば良いのだろうか?
[編集]→[設定]の画面を開いて、「品質」タブを選択する。「高品質変換」の中の「ディザリング」を「無し」に変更すれば良い。
デフォルトから先ほどのサンプル形式を「16bit」に変更するのは良い方法ではない。第一に、音声を編集する時に量子化エラーによる音声歪みが大きくなる危険性がある。第二に、「ディザリング」の設定項目を変更しないと、結局目的は達成されない。殆どの音声処理は内部的に32bitで実行されるので、前述したとおり処理のたびにディザが実行される。音声を生成する際もこれに該当するので、生成した時点ですでにディザが乗ってしまうことになる。

それでは。

最後に:
画像はクリックすると全体が見られる。
今回の記事はAudacity公式の以下のページを参考にした。
Dither - Audacity Wiki
Bit Depth - Audacity Wiki
スポンサーサイト



  1. 2018/01/28(日) 23:52:58|
  2. プログラミング
  3. | トラックバック:0
  4. | コメント:1

2017年振り返り
2018/01/20(土) 14:41:46

仕事



◆作業内容は?

2月~3月 試験作業と、発生した問題の調査分析
4月~6月 ライブラリ開発作業 ここだけは0から開発してた
7月 暇すぎた
8月 試験作業
9月 大炎上したプロジェクトの手伝いに駆り出される。残業が月60時間を超えて俺史上最高になった。
10月~12月 信号処理の向上 試行錯誤が多いけどまぁまぁ楽しい。

・「マジでやる作業が無いわ」って期間がある一方で、線表がギリギリ納期に間に合うかどうかというカツカツの時期もある
・試験をするプロジェクト(=ソースコードをほとんど書かないプロジェクト)をやってる時期はツラい

あと「チームで情報共有するためのwikiがあったほうが良いんじゃないですか」って言ってRedmine入れた(wikiのためだけに)。でも俺だけしか書いてないんだよな、どうやって他の人にも使ってもらえば良いんだろう。純粋に技術だけの話なら良いけど、人を巻き込むみたいなのはなかなか苦手だ。

◆資格
9月末にLPIC102取ってLPICレベル1を取得した。
そういや101取ったときはブログの記事を書いたのに、102のときは書いてないね。

◆得たスキル
考えてみたら、ほとんど無いんじゃないか……((((;゚Д゚))))ガクガクブルブル

基本的には「手持ちの知識と技術を使って作業をする」のが多いから、新たに知識と技術が身につくのがあまり多くはない。全くないわけじゃないけど。Redmine用のサーバをセットアップするときにネットワークの設定に苦労して、コマンドや設定ファイルの知識が身についた……くらいか? あとはvimを少しだけ覚えたくらいか? 何だか不安になってきたぞ。

あまりスキルが向上していないのは、メインで使っている言語がC言語なのが大きな要因だと思う。
C言語は基本的な言語仕様はそれほど複雑ではないので、ある程度学習するとスキルが頭打ちになりやすい。「処理量を少しでも削減したい」というような特殊な領域に手を出すと、覚えることは増えそうだが。

炎上したプロジェクトについても、「難易度が高いから、仕事を通じて知識を身につけた」というわけではない。
「難易度はやや高い程度だが、締切までの期間に比べて作業量が極端に多いから長時間残業せざるを得ない」という状態だったので、修羅場をくぐって知識や技術を得たとは言い難い……
教訓を得たとすれば……そうだな、「危険を感じたらそれは大抵の場合正しいから、迅速に上の人に知らせましょう。(ただし上の人に対処できる余裕があるとは限らない)」という点だな。スキルというよりプロジェクトマネジメント関係だけど。

ディジタルフィルタの挙動とかちゃんと勉強しとけば良かったな。余裕がないと納期に間に合わせるので精一杯になるから、そこまで手が回らないのが悔やまれる。あー、くっそ、それを自学自習で補えばよかったのか。

この間見かけた記事で「ITエンジニアが重視するのは成長機会」って話があったけど、成長機会……あるかな……悩ましいな……
ITエンジニア採用に欠かせない原則とは (1/5):IT人材ラボ

競技プログラミング


AtCoderレート 2017年始め909(緑)→2017年終わり1457(水色)
コンテスト出場が19回、うちレートが変動したのが16回。

AtCoder Linusレート変動
年の後半はあまり伸びていないや。
コンテストの最中はしっかり問題に取り組むけど、それ以外の自学自習をほとんどしていないから、スコアの伸びはそれほど速くない。
(この点はオリエンテーリングに対する態度と似ている。オリエンテーリングの大会には参加するけど、それ以外の走り込みとかを全くと言っていいほどやらない)
2018年はどれくらい力を入れて取り組むかな……

その他技術系


connpassを見てみたら、機械学習まわりに関心を持ってて「ゼロから作るDeep Learning」の勉強会とか行っていたみたい。
初めてデブサミ行ってみた。普段会社にいるだけじゃ知らない話を聞くことができて良かったので、今年も参加する予定。
あとはBattle Conference U30が楽しかった。今年も開催されるのかな?
技術系の勉強会やカンファレンスは、2017年の後半は事情により参加できなかったけれど、そろそろ復活していきたい。

あとは個人的開発がちゃんとできてないのが問題ですね……

音ゲー



SDVX:ADVX 現在のメイン機種。レベル17の難易度E(きらきらタイム、Triple Counterなど)がクリアできる程度。銀枠魔騎士。IVのプレイ回数は265回(2016/12/21稼働開始)。
DDR:たまにやりたくなってプレイする。しかし一度やらなくなると体力が落ちるから、以前のようにいかない……DDR Aのプレイ回数は121回(2016/03/30稼働開始)。
リフレク:一時期はメインだったのに今では全くやらなくなった。全部リフレシアとスイッチロングオブジェクトが悪い。リフレシアのプレイ回数は51回(2016/12/01稼働開始)。
チュウニズム:レート12.83

こんなところです!それでは。
  1. 2018/01/20(土) 14:41:46|
  2. 月ごとのまとめ
  3. | トラックバック:0
  4. | コメント:0