クーの自由研究

最下層からまた一段ずつ螺旋階段を登り始めます

計算機音楽の自由研究(実験:その4)~時には成功することだってある~

 

厳密ではないですが、原理的に離散ウェーブレット変換と等価です

こんにちは、こんばんわ。かえるのクーです。
(準備:5.2)で作成した『コレ(自己)ジャナイ符号』の性能をみてみます。

f:id:np2LKoo:20170922205913j:plain f:id:np2LKoo:20170922212222j:plain
f:id:np2LKoo:20170922214307j:plain f:id:np2LKoo:20170922214340p:plain
f:id:np2LKoo:20170922214324j:plain f:id:np2LKoo:20170922214401p:plain

 実験3で失敗の中に成功の片鱗がみえているので、あとはどれだけうまくいくのか興味です。

元にする曲:3分程度の曲を準備しました。

曲はYoutubeにアップしたけど、ブログ内キャンペーンもやったけど、公開してから半年以上たっているけど、今時点で総ビュー数「24回」を誇る「あの曲」です。

なお、このページでどれだけ再生してもYoutubeの再生回数はあがりませんので、あしからず。(このページに貼っているのはYoutubeでないので、あたりまえですが。)「Carpet of the sun」というプログレ好きの方ならたぶん聞いたことがある?Renaissanceの曲です。曲はプログレではなく、ブリティッシュなフォークトラッドです。歌っているのはミクです。

実験結果

SoundCloudの残り時間を温存したいので、復元した曲の最初の1分くらいのみをアップしました。(符号化器にかけるときにモノラル化していますので、復元もモノラルです。) 

復元音

 見事なまでに再現しています。もとの曲はずっとまえにSoundCloudにもアップしています。あたらめてはります。(こちらはステレオです。この曲を符号化器にかけて復元しています。)

元の音

よく聞かないと違いがわからないほどです。差があってもいわゆる「デジタル系」のブロック化ノイズではないので全然気になりません。(もとがステレオなので、比較は難しいですがほぼ再現できていると言っていいと思います。)f:id:np2LKoo:20170922202520p:plain上がエンコーダをとおして復元した波形。下2つが元の波形(左右チャンネル)です。モノラルになっているので、多少わかりにくいですが、ほぼ完ぺきといっていいくらいに波形がそろっています。

離散的な方法なので、必ず誤差が発生する方式での復元であるのに、この復元のレベルはすばらしいです。何度もきいていると、特に低域から中域にかけてのリズムやベースの「切れ」が、「かなり」そこなわれているのがわかります。まぁ、低域のウエーブレットのゆる~いエンベロープの重ねあわせで低域ができるので、無理はありません。が、そこも気をつけなければ、わからないくらいだと思います。

 

これは昨年の『「線形活性化関数」でも学習できる』件以来のクリーンヒットだと自画自賛状態です。もちろん、ボクが優れているのではなくて、離散ウェーブレット変換がすぐれていたのですが。最近の停滞ムードをかなり挽回できそうな感じがしてきました。 

符号化して圧縮したデータについて 

 

圧縮率を計算してみます。 

管理情報を除いた情報での計算です。 

元の音:(モノラル換算で計算)

44.1 KHz サンプリング 16it なので1秒あたり、882,000Bytes

符号化した情報:(こちらはモノラル、48Kにリサンプリングした情報で計算)

各周波数レンジについて12(半音)×16(位相)×1秒あたりの演算結果数( 48000(サンプリング周波数)/ ウェーブレットの幅(range0なら32,768)×4(幅あたりのシフト数))×4(32Bit浮動小数点の情報なので)

range = 0 (27.5 to 55 Hz):12 × 16 × 48,000 / 32,768 × 4 × 4 = 4,500 Bytes
range = 1 (55 to 110 Hz):12 × 16 × 48,000 / 16,384 × 4 × 4 = 9,000 Bytes
range = 2 (110 to 220 Hz):同様に 18,000 Bytes
range = 3 (220 to 440 Hz):同様に 36,000 Bytes
range = 4 (440 to 880 Hz):同様に 72,000 Bytes
range = 5 (880 to 1760 Hz):同様に 144,000 Bytes
range = 6 (1760 to 3520 Hz):同様に 288,000 Bytes
range = 7 (3520 to 7040 Hz):同様に 576,000 Bytes
range = 8 (7040 to 14080 Hz):同様に 1,152,000 Bytes
range = 9 (14080 to 28160 Hz):同様に 2,304,000 Bytes

合計 4,603,500 Bytes !!!

1秒あたり、4,603,500 Bytes です。

なんと約5.2倍になっています!圧縮どころではありません。演算のため16Bit整数ではなく32Bit浮動小数点にしているとはいえ、すこしデータが多すぎます。でも、これだけの情報をかけて符号化しているので、復元に優れているのは感覚的にしっくりきます。

圧縮符号化した情報はどんな感じ?

 エンコードした情報は、「12半音での周波数の解析結果が時系列にある」情報です。この情報があれば、

 ・もちろんそのままクロマグラム(12音解析)できる!
・そのまま縦横グラフにすれば、縦軸「周波数(対数)」横軸「時間」のスペクトログラムできる!
・局所的に周波数と位相に分離できているので、ちょっとした演算でイコライジングやエフェクトかけ放題
以下妄想
・基音が類推できれば、楽譜を生成できる!

・楽器の倍音構成が別に学習できていれば、さらに圧縮結果に自己符号化器をかけ、楽器音に分離して圧縮できる(かなりいい精度でトラッキング分離ができる「はず」)
・この情報さらにマルコフ解析やRNNとかパターン分析していけば、作曲パターンを分離抽出できる(ここは学習で!)

とりあえずやってみたいこと

 「圧縮」が目的ではないですが、2π1周を16分割しているので、この部分(位相情報部分)を畳み込めば、現状から単純に1/16に圧縮できるはずです。(今回は位相抽出用に各周波数16種のフェーズのウェーブレットを使用しています)

原音よりも容量が多くなっているのが意味もなく悔しいです。
興味本位で、圧縮率を高める方法をやってみます。

位相情報を畳み込むと、位相再生は完全に犠牲となり、原音復元からはずれますが。。。ボクとっても気になります。

 

たぶん次は「実験:4.1」くらいの表題にすると思います。

 

(追記:)位相の畳み込みについてはプログラム途中にうまくいかないことがわかったので、実験なしとなりました。 


(:追記ここまで)