クーの自由研究

素朴な疑問を実験します。ボクと一緒に螺旋階段を頂上まで登ってみませんか?貴方の影についていきます。

大切な人にこそ本物のブログを贈りたい(かえるのクー編)

ブログのネタにこまったときは

さて、長期おでかけで、実験もままならず書くことがありません。

f:id:np2LKoo:20171021003839j:plain

f:id:np2LKoo:20171021003926p:plain

f:id:np2LKoo:20171021004312j:plain

 

最近、当ブログに訪問いただいたJUN10 (id:kazu8ism) 様のブログに、「ネタでこまったとき」の記事がありました。こちらに紹介されている、「ブログ作成支援」に従ってむりやり記事を書いてみたいと思います。

タイトルもこのツールで生成してもらいました。

◆ 1 書き出し(結論で伝えたいことの反対のこと・原因となることで書き出します。

例)私、ブログにいつも悩まされているんです。
例)突然ですが、ブログで困っていませんか?
例)ブログについて、自分は・・・・だと思っていました。
例)あなたは、間違った・・・・をしていませんか?

なるほど、これだと一番上がいいですね。

 

ボクの悩み

ボク、ブログにいつも悩まされているんです。
何故って、理想は高いのに、ボクが書ける内容が貧弱すぎて、自分で後で読んでもイヤになるくらいです。

 

 

( まぁ、導入はこんな感じで。)

次は説明ですね。

◆ 2 説明(具体例やたとえ話で内容をわかりやすくして、読者に伝えます)

例)たとえば、・・・・なことだったり、・・・・なことがありますよね。
例)ブログの・・・・って、簡単に言えば、・・・・ということですよね。
例)・・・・なことって、よくありますよね。

これも最初のやつかなぁ。。。。

 

例えば

自分の考えや構想をカッコよく数式で表したり、、最新の論文にでている数式をロジックにしてさらっと組んで、実験して公表したいことなんて、よくありますよね。
でもなかなか、そんなことはできません。
どうやったら、もっと数式の本質を知ることができるのでしょう。そして使いこなせるようになるのでしょう。そんな方法は果たしてあるのでしょうか?

 

 

(う~ん。なかなかいい感じですね。)

◆ 3 解決法(上記1、2の解決法を書きます)

例)でも、・・・・をすることで、・・・・が解決するんです。
例)・・・・を・・・・したら、・・・・もうまくいったんです。
例)でも、ブログがあれば、・・・・が解決できますよ。

 これは、1番と2番の間くらいで。。。

 

解決法はこれだ!

でも、「物理学」を勉強することで、数式現実が繋がるんです。

 

そう、世の中は物理法則で成り立っています。それを数式で直感的に感じることができるようになれば銀河の運行から素粒子、はては量子力学まで、その本質を垣間見れるのです!

 

(う~ん。でも、こんなこと、ボクが言い切っていいのかな?)

 

 統計学ブームの次には必ず物理学が来ます
今はがぜん「ベイズ統計学」と「脳神経科学」を自習中ですが、これに「物理学」を加えることにします。

 

 

(わ~。こうなってしまいました。)

◆ 4 結論(思ったこと、他人に望むこと、自分の決意や覚悟を書きます)

例)というわけで、ブログを・・・・してみたいと思います。
例)これからは、ブログが必要不可欠です。
例)ぜひ、ブログをしてみることをおすすめします。

 上の例でも一番上がよさげです。

やるぞ!

というわけで、物理学をマスターしてボクのブログを数式だらけにしてみたいと思います。

 

(決意以外に実現方法も書かないとですね。)

 

物理の勉強といえば、そう某進学塾の「苑田 尚之先生」です。
ボクはかえるなので、通えませんが、幸いYouTubeなどに「ほんの少しだけ」どんな感じかがのってます。
「ハイレベル物理」を受講する(つもり)になって勉強します。

数式は言葉です、計算じゃない。
頭の中で見えていないといけないんです。
定義がちょっとでもあいまいだと途中で間違ってくるんだよ。
あれ、これ本当かなって思ったら自分でチェックする。
自然科学ってモデルなんです。あくまで。
ものを自分でかんがえるってどういうことなのか。それをお話しできたらなと。

う~ん。ぐっときます。最高です。

物理を勉強して数式で考え数式で伝える技をマスターし、このブログを数式だらけにしちゃうことをここに宣言します!

 

(こんな感じでしょうか。ますます読者がいなくなる予感。本当にこれでいいのかな?
完全な数式コンプレックスの裏返しですね。)

 

本気で数式を書きたいと思っていますが、そうできるかは勉強次第、ということで。

 

 さて物理の本をクリック、クリック。いろいろあるけど、ネットでは「親切な物理」とかが評判みたいです。諸先輩方絶賛です。

f:id:np2LKoo:20171021000950j:plain f:id:np2LKoo:20171021001220j:plain f:id:np2LKoo:20171021024737j:plain

 新・物理入門 (駿台受験シリーズ)  と迷ったけど、ボクには親切な方があっていそうな気がしました。同時に山岸涼子先生の「イシス」も購入。お出かけ前に間に合うかな?

 

 わお、本当にネタが何もないのに、かけた!すごい!

でも内容は。。。単なるお買い物ブログでした。でも単に「買ったよ」よりは断然よいです。

 

キャッチコピーもつくってもらいました。

【キャッチコピー・企画コンセプト案2】

さぁ、始まる、本気の自己符号化器

 

住みかに一時的にかえってきました

用事があるのでいったん住みかに戻りましたが、またすぐにおでかけです。(台風をさけて日曜移動です)次も3週間いってきます。予定では10月末までだったのに、少し延長です。

ますます太る予感。

 

 (さらに追記)

記事をおこすほどでもないのでここに追記します。久しぶりに住みかのパソコン使ったら、途中に急にRe:Bootする し、WiFiはつながらないわで大変。特にWiFiは5年くらい使ってて超絶調子悪いので、新しいWiFiルータをクリック。出費がかさみます。

f:id:np2LKoo:20171021143901j:plain

評判のよさそうだった TP-Link Archer C1200というのをクリックしました。

延長設置用のLANケーブルを含めて6,500円くらいでした。

お出かけ先の生活費がかさんでPC貯金が一向にたまらないのですが、来年は借金してでも実験に耐える「まともなパソコン」を買う予定です。ボクの「春~昏」をすべて自己符号化器にかけるつもりです!

 

 

Atomで夜ごと心から辟易する母なるかえるのために

今回はデバッグに関するお題です

こんにちは、こんばんわ、かえるのクーです。
危険な音」をきいて暗黒面に堕ちましたが、生還してきました。

f:id:np2LKoo:20171015125120p:plain f:id:np2LKoo:20171015125128p:plain

へんなタイトルですみません。(細かすぎて伝わらないネタ系です)

Atomマシンでのデバッグをなんとかする

Atomマシンで機械学習の勉強ををされている方も多いと思いますが、いかんせん非力です。遅いだけなら待っているだけでいいのですが、タイムアウトが多発してデバックになりません。
タイムアウトを伸ばすとクリックするごとに10分以上まつはめになります。
お気楽なボクでもこれには耐えられません。

f:id:np2LKoo:20171015140601p:plain

そこで、デバック用に変数の内容をレポートするロジックをつくりました。
Atom機でデバッグタイムアウトに悩む、同志のかえるさんやおたまじゃくしさんのお役にたてるかもしれないので、恥ずかしいソースながら貼ってみたいと思います。
汎用的に作ったつもりですが、今調整しているプログラムがメインターゲットなので、機能の過不足はあるかもしれません。
用途に適さない方は、いろいろ改変してお使いください。

こんな方におすすめ

Atomデバッグに悩む方
デバッグタイムアウトになり、変数の内容が見れない方
・多量の配列や変数の内容の概要を確認したい方
・配列を多次元に掘り下げ、収集がつかなくなったしまった方

主作用(機能と効用)

機能は見てのとおり、変数を引数に入れて呼ぶだけなシンプルなものです。
工夫したところは、以下の感じです。

・変数をセットしただけで "変数=" の部分を表示する。
・変数の型を表示する。
・配列はPytorch「風」に配列の大きさや内容を示す。
・多量のデータを扱うことがあるので、配列はデータの最初と最後くらいだけを表示する。

副作用

チェック機能やデバッグ機能に頼りすぎると、いきあたりばったりのコーディングをする生活習慣に陥る可能性があります。過剰摂取と長期服用による依存には十分ご注意ください。
日頃より、シンプルな設計とリファクタリングを怠らず、デバッグ機能に頼るのは必要最小限になるよう、心がけましょう。

有効成分

inspect:コードの調査を行うためのライブラリです。
re:正規表現を使えるようにするライブラリです。。
numpy:標準的な各種処方を行うライブラリです。

用法と用量

Atom、(もしくはCeleron,Semron)機以外の高スペックCPUの方はご利用に注意ください。おそらく、標準のデバッガをうまく使用したほうが幸せと思われます。


なお、Pytorchについてはガリガリ (id:s0sem0y)様の記事を読ませていただいております。わかりやすい説明に感謝です。

(あくまで個人の見解です)

ボクはこの機能でかなり(というか超絶)デバッグが捗るようになりました。
Atom機でPythonデバッグに悩んでいるすべての方におすすめします。

ソース

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import inspect
import re


class KooChecker():
def __init__(self):
pass

def rpt_obj(self, *args):
out = ''

back_frame = inspect.currentframe().f_back
back_code = inspect.getframeinfo(back_frame).code_context[0].replace(" ", "")
pos = back_code.find("#")
if pos != -1:
back_code = back_code[:pos]
arg = re.search(r"\((.+)\)", back_code).group(1)
# 呼び出し元関数の引数の変数名を取得。
arglist = arg.split(',')
ii = 0
for obj in args:
target = arglist[ii]
ii += 1
if isinstance(obj, bool) or \
isinstance(obj, int) or \
isinstance(obj, float) or \
isinstance(obj, complex):
out += '|' + target + ' = ' + str(obj) + ' ' + self.chktype(obj)
elif isinstance(obj, set) or \
isinstance(obj, frozenset):
out += '|' + target + ' = ' + self.rptset(obj) + ' ' + self.chktype(obj)
elif isinstance(obj, str):
out += '|' + target + ' = ' + self.rptstr(obj) + ' ' + self.chktype(obj)
elif isinstance(obj, bytes) or\
isinstance(obj, bytearray):
out += '|' + target + ' = ' + self.rptbytes(obj) + ' ' + self.chktype(obj)
elif isinstance(obj, list) or \
isinstance(obj, tuple) or \
isinstance(obj, np.ndarray):
out += '|' + target + ' = ' + self.rptlist([], obj) + '\n' + self.chktype(obj)
elif isinstance(obj, dict):
out += '|' + target + ' = ' + str(obj) + '\n' + self.chktype(obj)
else:
out += '|' + target + " =(DisplayNotImpliment) " +self.chktype(obj)
print(out)

def rptstr(self, obj):
strlen = len(obj)
# 表示内容を40文字までに抑制する
if strlen <= 40:
rtn = '"' + obj + '"'
else:
rtn = '"' + obj[0:20] + '...' + obj[strlen - 20:strlen] + '"' + "(len=" + str(strlen) + ")"
return rtn

def rptbytes(self, obj):
byteslen = len(obj)
# 表示内容を40byteまでに抑制する
if byteslen <= 40:
rtn = str(obj)
else:
rtn = str(obj[0:20]) + '...' + str(obj[byteslen - 20:byteslen]) + "(len=" + str(byteslen) + ")"
return rtn

def rptset(self, obj):
setlen = len(obj)
# 表示内容を20項目までに抑制する
if setlen <= 20:
rtn = str(obj)
else:
setstr = str(obj)
ss = (setstr.rsplit(",", setlen - 10))[0]
se = (setstr.split(",", setlen - 10))[-1]
rtn = ss + ', ...' + se + "(len=" + str(setlen) + ")"
return rtn

def rptlist(self, arglevel, obj):
out = ''
datalen = len(obj)
if datalen == 0:
out = '[]'
elif datalen <= 8:
for i in range(datalen):
if isinstance(obj[i], list) or \
isinstance(obj[i], tuple) or \
isinstance(obj[i], np.ndarray):
level = arglevel.copy()
level.append(i)
out += self.rptlist(level, obj[i])
else:
out += str(obj[i]) + ' '
else:
for i in (0, 1, 2, 3, -4, -3, -2, -1):
if isinstance(obj[i], list) or \
isinstance(obj[i], tuple) or \
isinstance(obj[i], np.ndarray):
if i in (0, 1, -2, -1):
level = arglevel.copy()
if i >= 0:
level.append(i)
else:
level.append(datalen + i)
out += self.rptlist(level, obj[i])
if i != -1:
out += '\n'
elif i in (2, 3, -4, -3):
pass
if i == 2:
out += '...\n'
else:
if i == 0:
out += str(arglevel) + '= '
out += str(obj[i]) + ' '
if i == 3:
out += ' ... '
elif i == -1:
out += '(len=' + str(datalen) + ')'
return out

def chktype(self, obj):
rtn = ''
if isinstance(obj, list) or \
isinstance(obj, tuple) or \
isinstance(obj, np.ndarray):
if len(obj) == 0:
rtn = self.chktype_name(obj) + ':0'
else:
rtn = self.chktype_name(obj) + ':' + str(len(obj)) + '*' + self.chktype(obj[-1])
else:
rtn = self.chktype_name(obj)
return rtn

def chktype_name(self, obj):
name = str(type(obj)).replace('<class ', '').replace('>', '').replace("'", "")
name = '<' + name + '>'
return name

用法

if __name__ == '__main__':
kc = KooChecker()
a = 1
b = 12.56
c = False
d = 2 + 3j
e1 = ''
e2 = "ABCDE123456" * 100
f1 = b''
f2 = b'A' * 100
g = bytearray(b'ABC' * 100)
h = set(range(100))
i = frozenset(range(100))
j1 = []
j2 = [range(100)]
j3 = [[range(10)],[range(20)],[range(30)]]
j4 = list(np.arange(10 ** 4).reshape((10, 10, 10, 10)))
j5 = [[list(np.arange(10 ** 2).reshape((10, 10)))] * 10] * 10
k1 = ()
k2 = (1,2,3,4,5,6,7,8,9,0)
k3 = (((1,2,3),(1,2,3),(1,2,3),(1,2,3),(1,2,3),(1,2,3),(1,2,3),(1,2,3),(1,2,3)) * 10)
l = {'one': 1, 'two': 2, 'three': 3}
kc.rpt_obj(a,b,c,d,e1,e2)
kc.rpt_obj(f1,f2,g,h)
kc.rpt_obj(i)
kc.rpt_obj(j1)
kc.rpt_obj(j2)
kc.rpt_obj(j3)
kc.rpt_obj(j4)
kc.rpt_obj(j5)
kc.rpt_obj(k1)
kc.rpt_obj(k2)
kc.rpt_obj(k3)
kc.rpt_obj(l)
kc.rpt_obj({'key': 100})

コンソール出力

|a = 1 <int>|b = 12.56 <float>|c = False <bool>|d = (2+3j) <complex>|e1 = "" <str>|e2 = "ABCDE123456ABCDE1234...CDE123456ABCDE123456"(len=1100) <str>
|f1 = b'' <bytes>|f2 = b'AAAAAAAAAAAAAAAAAAAA'...b'AAAAAAAAAAAAAAAAAAAA'(len=100) <bytes>|g = bytearray(b'ABCABCABCABCABCABCAB')...bytearray(b'BCABCABCABCABCABCABC')(len=300) <bytearray>|h = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ... 90, 91, 92, 93, 94, 95, 96, 97, 98, 99}(len=100) <set>
|i = frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ... 90, 91, 92, 93, 94, 95, 96, 97, 98, 99})(len=100) <frozenset>
|j1 = []
<list>:0
|j2 = range(0, 100)
<list>:1*<range>
|j3 = range(0, 10) range(0, 20) range(0, 30)
<list>:3*<list>:1*<range>
|j4 = [0, 0, 0]= 0 1 2 3 ... 6 7 8 9 (len=10)
[0, 0, 1]= 10 11 12 13 ... 16 17 18 19 (len=10)
...
[0, 0, 8]= 80 81 82 83 ... 86 87 88 89 (len=10)
[0, 0, 9]= 90 91 92 93 ... 96 97 98 99 (len=10)
[0, 1, 0]= 100 101 102 103 ... 106 107 108 109 (len=10)
[0, 1, 1]= 110 111 112 113 ... 116 117 118 119 (len=10)
...
[0, 1, 8]= 180 181 182 183 ... 186 187 188 189 (len=10)
[0, 1, 9]= 190 191 192 193 ... 196 197 198 199 (len=10)
...
[0, 8, 0]= 800 801 802 803 ... 806 807 808 809 (len=10)
[0, 8, 1]= 810 811 812 813 ... 816 817 818 819 (len=10)
...
[0, 8, 8]= 880 881 882 883 ... 886 887 888 889 (len=10)
[0, 8, 9]= 890 891 892 893 ... 896 897 898 899 (len=10)
[0, 9, 0]= 900 901 902 903 ... 906 907 908 909 (len=10)
[0, 9, 1]= 910 911 912 913 ... 916 917 918 919 (len=10)
...
[0, 9, 8]= 980 981 982 983 ... 986 987 988 989 (len=10)
[0, 9, 9]= 990 991 992 993 ... 996 997 998 999 (len=10)
[1, 0, 0]= 1000 1001 1002 1003 ... 1006 1007 1008 1009 (len=10)
[1, 0, 1]= 1010 1011 1012 1013 ... 1016 1017 1018 1019 (len=10)
...
**(略します)**
...
[9, 9, 8]= 9980 9981 9982 9983 ... 9986 9987 9988 9989 (len=10)
[9, 9, 9]= 9990 9991 9992 9993 ... 9996 9997 9998 9999 (len=10)
<list>:10*<numpy.ndarray>:10*<numpy.ndarray>:10*<numpy.ndarray>:10*<numpy.int32>
|j5 = [0, 0, 0]= 0 1 2 3 ... 6 7 8 9 (len=10)
[0, 0, 1]= 10 11 12 13 ... 16 17 18 19 (len=10)
...
**(略します)**
[9, 8, 9]= 90 91 92 93 ... 96 97 98 99 (len=10)
[9, 9, 0]= 0 1 2 3 ... 6 7 8 9 (len=10)
[9, 9, 1]= 10 11 12 13 ... 16 17 18 19 (len=10)
...
[9, 9, 8]= 80 81 82 83 ... 86 87 88 89 (len=10)
[9, 9, 9]= 90 91 92 93 ... 96 97 98 99 (len=10)
<list>:10*<list>:10*<list>:10*<numpy.ndarray>:10*<numpy.int32>
|k1 = []
<tuple>:0
|k2 = []= 1 2 3 4 ... 7 8 9 0 (len=10)
<tuple>:10*<int>
|k3 = 1 2 3
1 2 3
...
1 2 3
1 2 3
<tuple>:90*<tuple>:3*<int>
|l = {'one': 1, 'two': 2, 'three': 3}
<dict>
|{'key':100} = {'key': 100}
<dict>
お出かけ先で「夜ごと太るボクのために」

もうすこしダイエットをこころがけます。

危険な音を聞いてみました

おでかけ先からこんにちわ、こんばんわ

かえるのクーです。スティックタイプの派生パソコンの性能に辟易しながらも、インターネットをみる時間だけはとれています。

f:id:np2LKoo:20171015143137j:plain

実験はパソコンのスペック上の問題でほぼ休止状況です。来月がんばります。

危険な音って?

最近話題の某国大使館もしくはその住居で「もしかして使われた?」と噂されている「ソニックうぇぽん」についてのお題です。ダークサイドのお話がでてくるかもなので、苦手な方は読み飛ばしください。SAEO対策(アんチ方面)のためいつも以上に読みにくいです。ごめんなさい。
10/12にYoutubeでAPが入手したとされる5秒間の音の断片が公開されました。聞かれた方もいるかもしれません。マッドサイエンちストを目指すボクはこういうのにも「とても」興味をもってしまいます。

f:id:np2LKoo:20171014145500p:plain

By AP通信

何度も聞きましたが、別にどうってことのない音です。(人によってはいやな音かもしれませんが、私は「現代音楽を聴いても頭が痛くならないスキル」を修得済です!)

この手の情報は「情報操作されたもの」であるとみるのが普通だと思いますが、それは横に置いて純粋に「ぷち解析」してみます。
ボク、とっても気になります。

公開音については情報の性質上、リンクは張りません。 あしからずご了承ください。
Google で、"What Americans Heard in Cuba Attacks: The Sound" Youtube で検索すると、放送された内容がでてきます。

放送された音の内容について

44.1KHzサンプリングのステレオ音です。
左右の音はほぼ同じですが、わずかに差異があります。
スマホから再録音したものであれば、「ステレオとしての情報」はほとんど意味がなくなります。(スマホはステレオ再生がちゃんとできないため)

非力なマシンでどこまでできるかわかりませんが、今日のお題としてやってみます。
なお、AP通信の画像ではこのようなきれいな(そして精度が悪そうな)解析でした。

今回の音は録音した音をスマホ!で再生し、記者がマイクで再録音したものをさらにTVで流した音のようなので、かなり原音と違う気がします。原音の解析例は載っていました。

f:id:np2LKoo:20171014145618p:plain


ただし、研究機関が公表したグラフではなく、単なるスマホのソフト画像のようなので、その精度は不明な感じがします

一方、最初に貼った画像の方はそこそこの精度のようにも見えます。

 

とっても元のリソース(音)がほしいのですが、それは望めませんのでこの音で解析してみます。

Librosaでそのままスペクトログラム解析してみました。

f:id:np2LKoo:20171014145727p:plain


7215Hz付近を中心にほぼ、時間的に変動がないのがわかります。輝線が1本のようにみえるところに4から6個の周波数ピーク集中しています。多少強度のゆらぎがある感じです。他には0.6秒、2.0秒、2.2秒... あたりの8000Hzから9000Hzの黒い部分が特徴的です。(これはマイクを固定していないことや、マイク付近の手などの吸音物質の動きによる効果ではないかと考えています。)
2195Hz付近の音は対象音が流れる前からでているので、何らかの別のノイズとおもわれます。

次はフーリエ解析のグラフです。近接した複数の周波数が「なっている」ようなので、対数軸でなくリニア軸にして表示してみました。

f:id:np2LKoo:20171014150111p:plain


放送のグラフほどきれいにはなりませんが、7215Hzを中心に複数周波数があることがわかります。
放送のグラフにはありませんでしたが、13.5KHzから14.5KHzあたりにも明確な音があります。

これ以上の解析はプログラムを組まないと難しそうです。

考察(大胆な発想飛躍)

報道される状況をみると以下の可能性が考えられます。(他の方の考察とほぼ同じだと思います)
・ミリ波またはマイクロ波の指向性の強い電磁波が複数源から意図的に特定箇所へ放出された。
・可聴域を超える強いパワーをもった音源から特定箇所に向けて指向性をもって放出された。
・複数の某国家電製品が、経年変化により凶悪な可聴域を超える「コイル鳴き」や電子ノイズを派生させ、その複合効果で現象をひきおこした。

別の一部報道では可聴域を超える音波が原因とみられることが報道されています。
立場をかえて、蛇に反撃するかえるのつもりで考えてみます。

ボクは大吉凶悪なかえるなのさ(なったつもり)

高い周波数の音波は障害物のある場合に透過伝達が困難なため、住居、または施設に向けた攻撃には適さないと思われます。可能であるとしたら、施設内に特定家電製品に紛れて送り込むのであれば、有効と思われます。
この場合は専門家が測定すれば一発で発生源をつきとめられるので、よい手段には思えません。

ミリ波・マイクロ波であれば通常の住居でしたら通過しますので有効です。
観測されている音響効果は、電磁波による金属や物質の受信作用に伴う共鳴現象の可能性があります。
生物に対して直接作用する例はフレイ効果(マイクロ波聴覚効果)が知られています。

こんなの考えました

以上より、いちばん可能性が高いと勝手に思うのは、
「可聴外周波数を(2次)誘発する変調を行ったマイクロ波兵器を複数個所から使用している。代表的変調周波数は、以下の組み合わせ。
30,018Hz±60Hz
29,808Hz±60Hz
29,633Hz±60Hz
29,405Hz±60Hz
29,262Hz±60Hz
29,093Hz±60Hz
28,951Hz±60Hz
28,758Hz±60Hz

でした。(放送された音は44.1KHzのナイキスト周波数の折り返しノイズであると「想定」しただけです)

これで、マイクロ波と同調(共鳴)し、音響効果をもつ(音がなる)物質がすべて発生源となり、特定ができなくなると想定します。なお、これが正解だとは微塵も思っていませんが、ボクがあく意を持っていればこう設計するかもしれません。いや、ボクがさらに「悪い」をもっていれば、きっと現代音楽的不協和をそのまま変調します!

さらにダークなボクであれば、1次変調に民生用機器では測定困難な複数192KHz以上の周波数を使い、1次効果で発生する複数超音波の2次的効果(20KHz超えのうなりとしての周波数)を生むようにするかもしれません。そうすると、1次変調周波数は238,464Hz, 237,064Hz,235,240Hz..... あたりを使うかもしれません。(もしくは、237KHz±14.4KHz)

考察の理由は以下です

・長期にわたる現象であるが、特定が困難であること(近接していない複数発生源とおもわれる)
・一部生体組織の損傷の可能性の報道がある。(組織損傷できるくらいならミリ波・マイクロ波と思われます。音波には困難です。。超音波が組織破壊をするなら怖くて健康診断が受けられません。)
・可聴領域のアタックであれば、耐えられないので、すぐ退去したり対策したりするが、そうなっていない。
・可聴音が聞こえるのは2次的、3次的な現象によるものと推測してみる。人によっては可聴外でもかんり聞こえる人も「まれに」いる。

どうであれ悲しいことです

なお、人類におかれては、こうした技術を用いたご近所いやがせ装置が「通販」されている現状は(性能はともかくとして)悲しむべき現実です。(こういうのは、検索すると気分が悪くなると思うのでやめておきましょう)

人類のみなさん。もっと「なかよく」やってください。

 

興味があったので、書きましたが、ダークなものはやっぱり苦手です。ダークサイドは月の裏側だけにしておきましょう。

へびさんともなかよくしましょう。そうしましょう。

クーは1ヶ月くらい住みかに不在となりますのでご挨拶

秋ですねぇ

夕食時くらいに空をみれば真っ暗で、月がとってもきれいです。

f:id:np2LKoo:20171001175838j:plain

昨年の冬眠日は記録によれば11月24日だったようです。(全然覚えていませんが)

冬眠にそなえて体力をつけます。*1

10月末まで不在です

10月は先にご案内のとおり不在となります。行先でもブログが「書ける」よう、小さな「ボトル型」パソコンを買いましたが、そんな(時間的、精神的)余裕があるのか、実はわかっていません。

でも、Pythonとpycharmは動かしたかったので、インストールしました。行先で資金がなければどこへも行かず、引き籠ってブログ三昧できるかもしれません。または、忙しすぎて風呂にはいってねるだけ~♪な生活が待っているかもしれません。

買ったパソコンは「実験」できるスペックのパソコンではないです。(メモリ4GBなので、がんばってコンバートした音の学習データを読み込んで、配列にした時点でアウト。)記事はほとんど書けない「かも」ですが、がんばってみます。(実験のない「妄想」記事ばかりになったらごめんなさい:このブログは(説明できる力量がないため)「技術説明」「論理」はほとんどなく、ひたすら「実験」と「妄想」(よくいえば仮説)でできています。)

11月は?

11月は戻ってくる予定ですが、11月末(くらい)までの活動がどのようにできるかわかりません。

今年も「助手」に、冬眠中のこのブログの保守と、「1ヶ月に1つは記事を書いてつなぐ」ことを依頼します。どちらにせよ残り少ない今年の活動を精一杯がんばりたいと思います。めざせ!新機軸!!

それでは行ってまいります

 ではごきげんよう

達者でなァ。

(結局やっぱりこの2言が言いたいだけのブログでした。)

*1:ブログ主のボク「かえるのクー」はおおよそ12月から3月まで冬眠します。自然の摂理にはさからえません。

計算機音楽の自由研究(準備:その5.4)~コレ(自己)ジャナイ符号化器の調整 ~

 

汎用部品として採用です

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

f:id:np2LKoo:20170927152421p:plain

ストレートパーマ&癖毛矯正

(c)HOT PEPPER Beauty

 

凝りもせずヘアスタイルアイキャッチ

 コレ自己ジャナイ符号の性能がいいので、実験用の汎用部品とすべく、さらに調整して性能測定します。部品の名称は改めて考えます。
なお、部品にできたらそのうちGitHUBにソースを公開できたらいいなぁ。と考えています。
今回は調整の記録としてのブログで、あまり読みどころはありません。

調整内容

調整は地味な作業で、経過をはってもつまらないので、やり方と結果と最終調整後の性能測定だけを記録します。なお、パラメータの追い込みには自分の耳があてにならないので、ちゃんと測定して判断しました。

やり方

(1)元の波形を48KHzモノラルに変換する(出力と同じフォーマット)
(2)元の波形を符号化器にかけ、復号波形を出力する。
(3)元の波形と符号化器の出力の「差」も出力する。
パワースペクトルが元の波形となるべく同じになるように、全体振幅を一律調整したあと単純な「差」をとり、その波形(波形差)を出力する(最小2乗法相当)
(4)今回の調整では確認にAudacityが適しているので、Audacityに波形をよみとらせ、解析する。(主にスペクトラム分布)
(5)パラメータをかえながら、データを採取して、パラメータを追い込む(データ量がすくなく、かつ特性がほぼ劣化しない点を探す)
(6)数値も、波形も、視聴上もほとんど差がないときは、波形差と波形差のさらに「差」をとり視聴する。(こうすると当たり前ですが、一聴して差がわかる:波形差だけでは違いが分かりにくくても、(パラメータ変更による)「波形差の差」ならわかりやすい。なお、波形差の差が自然な音(周波数特性がフラット)であればまったく問題ない。)

(7)波形差(または波形差の差)に元波形にないノイズが、無視できないくらいあるかかどうか確認し、パラメータをどうするか決める。これは数値と視聴両方で確認する。

なお、今回はほぼどれも、ボクには復号波形が同じ音にしか聞こえないので、音は貼りません。あしからず。(波形差の差は小さい音ですが、わかりやすいです。倍音構成が崩れたり、元の波形にない周波数(歪み)が聞こえます。)

変更・調整点

お題 パラメータ 元のパラメータ
位相バリエーション: 4(90°)とする 16(22.5°)にしていたがそこまでは不要
ウェーブレットの幅:

低域を標準よりこまかくする。(時間(低音のキレ)優先のため)

高域を標準より粗くする。(容量削減のため):

周波数が2倍になれば、ウェーブレットの幅は1/2にする。(これが標準)
ウェーブレット振幅:

周波数の二乗に比例させる

ウエーブレット幅の二乗に比例させる。
ウエーブレットのシフト幅: のままとする 視聴上は3でもよいくらいだが、測定すると微妙なノイズ(元波形とのいや~んな感じの差異)がでる。(5でもさらに改善されるが、改善幅が小さいので4のままとする)
基準音(最低音):

F#0(23.1Hz)とする

48KHzサンプリングに適したレンジになるように調整

ピアノの再低音A#0(27.5Hz)とする。

 

特性測定

聞きなれたサンプル曲で調整しましたが、最終的にホワイトノイズで特性確認します。

元の音(ホワイトノイズ)の特性

元の周波数特性20Hz以下がすこし暴れているように見えますが、フーリエ解析の精度によるものです。ホワイトノイズなので、基本的にフラットです。

Audacityの解析グラフです。音の実験には、AudacityとSoundEngineFreeは必須です。

f:id:np2LKoo:20170927154551p:plain

復号再生音の特性

再生パワーが元の音と少しちがいますが、ほぼフラットです。10KHzまではほぼ±2.0dBに収まっています。

f:id:np2LKoo:20170927154617p:plain

23.1Hz(F#0)以下は合成していないレンジなので、「ない」ので正解です。

10KHz以上は数値的には酷いですが、視聴上はまったく差異がわからない(ボクの耳はばかな耳)ためデータ量がすくない方を採用しています。もうひとつ上のパラメータを選べば本当にきれいにフラットなのですが、実験速度優先=容量優先 にしています。なにせ、高い周波数はデータ量が多い(=計算するポイントが多い:ウェーブレットの幅がせまくシフト幅がせまい:周波数2倍で計算ポイントが2倍となる。)ので、すこしでも削減したいのです。

元の音と復号再生音の差異(歪み)の特性

30Hz~10KHzにおいてほぼフラットなので、素直な再現特性であるといえます。再生特性に偏りがあると右上がりや右下がりのグラフになりますが、いい感じです。

f:id:np2LKoo:20170927154703p:plain

23.1Hz以下はほぼ元の波形の成分です。

少し気になるのはオクターブ毎に発生しているリプル的な乱れです。F#付近での差異増加です。F#は周波数レンジ(ウェーブレットの幅)切り替えの音の周波数なので、この切り替えポイント前後でうまく周波数特性が平滑化されていないような感じです。たしかにプログラムではその点の考慮をしていません。なるほど、F#境界ではウェーブレットの幅をかえるので、余計に重なり振幅が多めにでる区間があります。視聴上は特に問題ないので、今回はそのままスルーします。(追記:と思ったのですが調整しました:追記ここまで)

10KHz以上のくし形の大きな乱れ(差の増加)は「容量削減優先」の大義のもと、目をつむります耳をふさぎます。

(追記:)

結局、重なり部ピークを分散させる感じで調整しました。わずかですが改善しました。

最終調整後の復号波形の特性

f:id:np2LKoo:20170927221202p:plain

最終調整後の波形差の波形(歪み)の特性

f:id:np2LKoo:20170927221251p:plain

30Hzから10KHzの差の最大が、-62dBから-67dBへと改善されており、局所的ピークもある程度解消されたました。まぁ、聞いても全く違いがわからないくらいなのですが。

(:追記ここまで)

そろそろ来月1ヶ月おでかけの準備をしないと

f:id:np2LKoo:20170927175252p:plain

では、ごきげんよう
達者でなァ

 

計算機音楽の自由研究(実験:その4.2)~位相がだめなら周波数削減してみる~

秋は月がきれい

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

f:id:np2LKoo:20170925235044j:plain

(c)アシストウィッグ

 

ヘアースタイルネタの「アイキャッチ」画像の流れに意味はありません。成り行きです。

 

実験4.1は位相削減の予定でしたが、準備段階で中止となりましたので欠番です。

位相の削減がだめなら、周波数の方を削減(間引き)したらどうなるかの実験をします。

ああ、まったく脈絡ないですが、ラズパイ欲しい!!電子工作してみたい!!

実験

周波数は12音階を基底にしていますが、これをもっと減らしたらどのへんで限界がくるのかやってみます。

12音階の場合、1オクターブは12等分(2の12乗根)単位に分割します。
これを9等分(2の9乗根単位)にしたり、それ以下にして再現性がどうなるかやってみます。

この実験は、「コレ自己ジャナイ符号」のパラメータをかえるだけですぐ可能です。

結果

オクターブ9音階の場合 ぱっと聞いた感じではそれほど劣化していないと思います。

オクターブ8音階の場合 すこしギターのカッティング音に歪がでてきます。

オクターブ7音階の場合 かなりダメです。

オクターブ6音階の場合 もう完全にアウトです。再現できない音がでてきます。

オクターブ2音階の場合 なぜかガムラン風になりました。例によって感受性の高い方は視聴をお控えください。ボクは嫌いじゃありません。(ちなみに、ボクは「現代音楽を聴いても気持ち悪くならないくスキル」を取得しています。)

ボクの鈍感な耳的には9音階の場合はほぼ12音階と同じに聞こえますので、多少マージンはある感じがします。12音階のほうは何度も貼ったので、改めて聞かれたい方は実験の方を参照ください。

考察

以上、より、基本周波数+位相変化で多少の周波数変動は追従可能ですが、基本音程の半音程度の変動には対応できない感じです。

なんやかんやで「ウェーブレット変換」の技を(音的に)事実上マスターしました。(マスターはおおげさですが、解析でも合成でも使えるようになりましたので、必要最小限の応用はできます。)*1

成果と実用性

いろいろ実験して「ウェーブレット」での符号化:周波数解析(フィルタ)と復号:(ウェーブレット合成)はことのほか性能がよいので、今後も「音の実験」での入力段や出力段に使用すると思います。

ウェーブレットの層の間に、本来の「自己符号化器」を入れて、どのように学習ができるのかを確認していければと考えています。

生物でたとえれば、「ウェーブレット」での符号化部分は「の蝸牛」(時系列周波数解析器)、復号化部分は「声帯(万能)」(音声合成器)に相当するともいえます。

「ウェーブレット変換」と「フーリエ変換」についてはこれで一区切りです。(フーリエ変換はほぼスルーです)

今後の実験の方向について

例えばですが、「ウェーブレット変換」でピアノの音(の特徴)を学習して、曲からピアノの音とそれ以外を分離することができるか。などについて挑戦したいと思います。あ、それもとも自分の声をお気に入り声優の声にしちゃうモーフィングやろうかなぁ。(やりたいことは山ほどあります。気が変わって別路線いったらごめんなさい)

道草しましたが、ようやく音の機械学習のスタートラインに立てる感じです

冬がくるまでかんばる!

 

ポキン金太郎な「かえるキャンディ」売ってました

f:id:np2LKoo:20170926002553j:plain

ではごきげんよう
達者でなァ

*1:ウェーブレット変換といっても離散系の「多重解像度解析」でいろんなことろを「離散で近似」しているのと、とっても冗長でもっと効率化できるはずのところが結構あります。(ウェーブレットも直交系ではなく普通のsin波にハン窓をかぶせたものです)「かなめ」は外していないと思っています。

計算機音楽の自由研究(準備:その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:結局予想はおおはずれでした