クーの自由研究

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

計算機音楽の自由研究(準備:その5.3)~なんちゃって符号化器の設計と製造 ~

ちょっと気がかわってしまいました

こんにちは、こんばんわ。かえるのクーです。

f:id:np2LKoo:20170923212303p:plain

(c)池田真子様

そのまま、前作の位相方向を圧縮しても結果は予想できておもしろくない*1ので、位相を圧縮するコンセプトはそのままに、(実験の結果をふまえ)「感性のみ」でつくったらどうなるかやってみます。
符号化器からかなり逸脱するかもしれないので、「なんちゃって」です。
完全に機械学習からそれた道草ですが、調子がよければ、音に関する標準的な検出器、生成器としてモジュール化しようと思います。

前作の反省から修正のポイント

 ・とにかく低音の切れがわるいです。窓枠をもっと小さくして検出します。
・情報が多すぎます。位相検出は16方位(22.5°)のままとしますが、位相を畳み込み、生成は0°のみにします。
・ウェーブレットのシフト幅は幅の1/4としていましたが、1/2とします。
・波形の再生はウェーブレットの合成を使わずに位相0°のsin波にウェーブレットで検出した値をエンベロープとして適用することにより合成します。
・波形エンベロープは検出2点間は基本的に線形補間します。立ち上がり閾値と立下りしき値を設け、このしきい値をまたぐエンベロープは形を補正します。(低音のキレを保つ工夫です)

プログラムデザイン

 理論にとらわれず自由な発想でやってみます。

お題 内容
プログラム名: なんちゃって符号化器
コンセプト1: 重み基底にウェーブレットを用いた局所的周波数検出を行う。
コンセプト2: ★符号化されたものは位相を畳み込んで圧縮する。★
コンセプト3: ★圧縮された符号から基底周波数ごとのエンベロープを生成する★
コンセプト4:

★曲起点の位相0°の基本周波数sin波とそのエンベロープを使い復号する。★

(これにより波形合成時のノイズをなくす)

コンセプト5: ★圧縮で犠牲にするのは「位相」情報と12KHz以上の音。★

 

重み基底に使うウェーブレットの設計

 前回とほぼ同じですが、一部違います。違うところを赤系にします。

周波数の範囲を下げて、ウェーブレットの幅を狭くしています。前回はA音を基準にしましたが、今回は他との関連ですこしかえます。

お題 内容
周波数バリエーション: ピアノの最低音A★より3半音低いF#0(23.1Hz)★からはじめ、★9オクターブ★の12半音(平均率)を準備する。
位相バリエーション: それぞれの周波数について、位相360°(2π)を16分割して準備する。
エンベロープ ウェーブレットのエンベロープはハン窓(ハニング窓)を使用する。
サンプリング: 48KHzを基準とする。
ウェーブレットの幅: 2のべき乗幅とし、オクターブ毎に幅をかえる。また、各窓は★8周期以上★のsin波が収まるようにする。(低周波ほど窓幅が広い)
重みの強度(振幅): 最終的な演算後の各周波数レンジのパワースペクトルが同じになるように振幅を調整する。2段の(リニア)乗算演算を行うため、ウェーブレット幅の平方根の逆数に比例するように設定する。
重みの数: 基底重みの数は12(クロマ)×★9(オクターブ)★×16(フェーズ)=1728(重み個数)となる。

 

入力前処理の設計

 同じです。

お題 内容
サンプリングレート変換: 内部で48KHzで演算するので、入力のサンプリングレートを48KHzに変換する。
チャンネル数: 内部でモノラルで演算するので、チャンネルを1にする(左右ミキシング)

 

エンコードの設計

 ほぼ同じですが、容量削減のための変更をしています。

お題 内容
重み枠シフト(スウィープ)幅: ウェーブレット重み幅の★1/2★とする。
使用する重み基底: 上記のウェーブレットのセットを用いる。
活性化関数: ランプ関数(ReLU)を用いる。
周波数上限 ★上限を12KHzとする。★
バイアス: 活性化関数にバイアスは用いない。
内部演算: 32Bitの浮動小数点とする。

 

畳み込みの設計

 今回新設。位相について畳み込む。

お題 内容
畳み込み計算: ★同一周波数について計算された活性化値を合計する。★

 

デコードの設計

 ウエーブレットのかさねあわせでなく、基本周波数のエンベロープで演算合成する。

お題 内容
重み枠シフト幅: エンコードと同じとする。
補完: ★計算ポイント以外の「シフト幅の間」をリニアで補完する。★
使用する基本周波数: ★(窓ではなく)原音開始時点で位相0°のsin波を使用する。★
活性化関数: 恒等関数(Liner)を用いる。
バイアス: 活性化関数にバイアスは用いない
内部演算: 32Bitの浮動小数点とする。
周波数上限から24KHz: ★12KHzから24kHzは計算値を使用する。(3-6KHzと6-12KHzの情報から推定計算する)★

 

デコードのエンベロープ補完の補足

 今回新設

お題 内容
立ち上がり閾値 ★立ち上がり閾値をまたぐ値変化の場合は、リニアとせず、直前1/4幅ポイントのしきい値から立ち上がるものとする。★
立ち下がり閾値 ★立ち下がり閾値をまたぐ値変化の場合は、リニアとせず、直後1/4幅ポイントのしきい値へ立ち下がるものとする。★

 

波形の最終出力の設計

 前回と同じ

お題 内容
サンプリングレート: 一貫して内部48KHzで演算しているので、そのまま48KHzで出力する。
Bit幅: 16Bitに変換して出力する。

 

予想

 どこかに問題があれば、ひどい音になりますが、そこそいけるように思います。

そこそこが「いいかんじ」なのか「なしよりのあり」なのか、はたまた勘違いなのか、ボクとっても気になります。

プログラム

 いまからつくります。ウェーブレットや復号時ののエンベロープの計算が難しそうです。

。。。

途中まで作って中間確認確認しましたが、破綻していることに気がついたので、中止します。申訳ありません。

 

中間結果

中間結果の再生音です。「周波数上限から24KHz:」の補完をしていない状態です。

平均律の基音のみで、位相を全く丸め込んでいるので、平均律以外の周波数をまったく再生できないなったため、倍音の再現が破綻してしまいました。また、同様に位相の情報喪失により、基音周波数以外の(微調整による)再現性がまったくなくなりました。

位相を連続的に前方向(または後ろ方向)にずらしていけば、基底周波数以外の周波数も表現できます。これを完全に潰していることになります。

実はボーカルや楽器音がいわる「ケロケロ」音になることを予想していたのですが、それ以前の問題で、原型はかろうじて留めますがまったく聞くに堪えない音になります。

視聴注意ですが、いちおう再生音をはります。(感受性の高い方は、気分を害される可能性がありますのでご注意ください)

 

「位相情報をはずしたらどうなるか」のお題なので、位相情報をはずしたら破綻することがわかったのでこれにて終了です。本当に「なんちゃって」でした。

うまくいきそうな予感は完全な勘違いでした。

どうもおさわがせしました。

が、これで終わるのも中途半端ですので、前回のプログラムで、周波数レンジごとに再生したもの(指定レンジでのみ波形合成したもの)を穴埋めで貼ってみます。

こちらは周波数ごとにちゃんとした音ができています。フィルタリングした音ではないことにご注目ください。ウェーブレットでの生成音です。各レンジの復元音で基本的にその周波数以外はほぼ含まれていません。(ただし、位相かさねあわせの綾で、基底周波数以外の周波数もすこし含まれます)

前回のコレ自己ジャナイ符号による指定レンジのみの波形合成(部分的デコード)をしてみます。位相情報を削除していないので「まとも」です。 

range = 0 (27 to 55 Hz) range = 1 (55 to 110 Hz) 切れがわるいのがよくわかると思います。range = 2 (110 to 220 Hz) このあたりもぼやけて聞こえます。 range = 3 (220 to 440 Hz) range = 4 (440 to 880 Hz) range = 5 (880 to 1760 Hz) range = 6 (1760 to 3520 Hz) range = 7 (3520 to 7040 Hz) range = 8 (7040 to 14080 Hz) range = 9 (14080 to 24000 Hz)※聞こえなくてもボリュームを上げないでください。

ボクはこれ(Range=9)が全く聞こえません。サウンドエンジニアになるのは諦めています。 

ちなみにこれらをすべてミキシングすると前回の実験通りになります。というより今回無理やりバラしたのですが。。。

前回の実験結果を比較のために再度貼っておきます。(こちらのほうがすこし長めにトリムしています)

 

今度はどんな実験をするか考えてみます。

(プログラムは作成途中で中断したので貼りません。あしからずご了承ください)

 

 教訓

位相情報って大事です。

プログラムは中断しましたが、補間やsin波について勉強しました。

from scipy import signal, interpolate

 scipy最強です。

 

*1:結局予想はおおはずれでした