LoginSignup
25
23

More than 5 years have passed since last update.

海苔音源をプログラミングでなんとかしてみる

Last updated at Posted at 2015-11-08

概要

 近年の音圧戦争により、「マスタリング段階で波形の高い部分がダイナミックレンジに収まりきらずクロップされてしまう」という憂き目に遭う海苔音源が多く発生しています。大雑把に原因を示した画像もありますが、こうなると無駄な高周波成分が発生して音が劣化するのは火を見るより明らかですね。
 そこで、適切に補間することで、その状態をどの程度解消できるかを実験してみることにしました。

まずはライブラリを揃えよう

 wavファイルを読み込むためのライブラリは、適当にググッて見つけた「WAV ファイルを読み込むよ!」にしました。8 or 16bitで1 or 2chのwavファイルを読み込めるC++用のライブラリですが、微修正(少しincludeの記述を追加)程度でVS2013でも使えたので凄く助かりました。
 このライブラリでは、1データにつき8bitでは0~255、16bitでは-32768~32767の範囲のshort型として読み込みます。また、各チャンネルごとのデータはstd::vector<short>型に代入されるので、C++側から扱うのが楽というメリットも……良いですね、良いと思います!
 また、「クロップされた部分」の定義についてですが、とりあえず「生の値が一定以上・以下であるもの」とします。例えば16bitオーディオなら、「-32760以下か32760以上のデータ=クロップ箇所」とする感じですね。1データだけなら誤差かもしれないので、そういった極端に大きな値が2データ以上続いている場合を対象とします。

補間方法を考える

 数学上での補間は様々存在しますが、ここでは線形補間およびラグランジュ補間を使用することにします。
 線形補間の場合、$(x_0, y_0)$と$(x_1, y_1)$とを通る直線が$y=y_0+\frac{(y_1-y_0)(x-x_0)}{(x_1-x_0)}$で表されることを利用して、図1のような三角形に補間します。
 ラグランジュ補間の場合、$(x_0, y_0),(x_1, y_1),...,(x_N, y_N)$を通る曲線が$y=\sum_{k=0}^N L_k(x)y_k L_k(x)=\prod_{j=0}^N \frac{x-x_j}{x_k-x_j} j\neq k$で表わされることを利用して、クロップ箇所の前後から2点づつ取って3次関数として図2のように補間します。
cap.png
 ……なお、ここでお気づきの方もいらっしゃると思いますが、補間する際は全体の音量を下げた後、補間部分でクロップ箇所を埋めるといった作業になります。

実験および結果

 上記の考えからC++で実装しました(試行錯誤中なのでソースは貼れませんが)。補間するサンプルとして、Sound Engine Freeで適当に生成した正弦波(10Hz,最大音量は0dB)を6dBだけ持ち上げて無理矢理音割れさせたものを用意します。それを線形補間およびラグランジュ補間したものについて、Wave Spectraでピーク値を取得することにより比較しました。なお、FFTのサンプリング数は4096・Hanning窓とします。
cap2.png
 こうして見る限りでは、線形補間よりもラグランジュ補間の方が明らかに質が良いと分かりますね。若干山の高さが低く見えますが、元波形を伏せられた場合を考えるとまあまあ妥当と言えるでしょう。
 もちろん実際の曲でも検証しています。以前レンタルで借りてきてリッピングしておいた「only my railgun」のCD音源を引っ張ってきましたが、補間前におけるクロップ箇所が、補間後では解消されていることが分かるでしょう。
only my railgun.png
 あいにくとても耳が良いわけではないので、聴感としてどれほど違うかははっきりとは分かりません。一応試せるサンプルを配布しますので、是非あなたの耳で確かめてみてください(そしてこの記事にコメントいただけると幸いです)。

ソフトの配布URL:
https://drive.google.com/file/d/0B22mWPiNr-6-M1k3aTcwSi05QXc/view?usp=sharing

追加実験(2016/01/01)

 更に今回、補間方法としてスプライン補間を用いたものを作成しました。これの場合、周辺4点どころかいくらでも増やせるので、精度向上が期待できます。更に改良として、スケールを動的に決定させることで、前回のように「何dB減らせばちょうどいいんだ?」と悩む必要を無くしました。テストデータとしては、Sound Engine Freeで適当に生成した正弦波(10Hz,最大音量は0dB)を6dBだけ持ち上げて無理矢理音割れさせたものに対して、前回の補間および今回の補間を実施し、AudacityでFFT幅4096・Hanning窓で表示させて比較しました。結果がこちらになります。
合体.png
 ……なんと言うか、前回とあまり変わってませんねorz
 とは言えソフト的には大幅に使いやすくなったはずですので、ここにうpしておきます。

ソフトの配布URL2:
https://github.com/YSRKEN/Decropper/releases

25
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
23