雑感等

音楽,数学,語学,その他に関するメモを記す.

pythonで自己MIC(相互情報量)関数を計算

自己相関関数では,ある信号sig(t)とその信号を時間kだけ遅延させた信号sig(t+k)との相関係数を計算するが,
ここでは相関係数の代わりに相互情報量(MIC)を求める関数automicを示す.
MIC自体はminepyで計算する.

下記プログラムを実行すると,グラフが2つ表示される.

"""
「自己」相互情報量(MIC)関数を計算する.
自己相関関数において,遅延と相関係数の関係を求めるように,
本関数では,遅延とMICの関係を求める.
"""
from minepy import MINE  # MICの計算ライブラリをインポート
from typing import List  # 型表示における"List"を有効化


def automic(sig: List[float]) -> List[float]:
    """
    sig[0](遅延させていない信号)とsig[k](k点遅延させた信号)との相互情報量を求める.
    :rtype: List[float]
    :param sig: 1次元の数値配列.時系列信号など.
    :return: 1次元の数値配列mics.mics[k]は遅延kにおけるMIC.
    """
    mine = MINE()
    siglen = len(sig)
    mics = []
    for k in range(0, siglen - 1):
        mine.compute_score(sig[k:-1], sig[0:-k - 1])
        mics.append(mine.mic())
    return mics


if __name__ == "__main__":
    import numpy as np
    from matplotlib import pyplot as plt

    fs = 100  # サンプリング周波数
    f = 4  # 周波数
    tmax = 1  # 終了時刻[s]
    t = np.arange(0, tmax, 1 / fs)
    sig = np.sin(2 * np.pi * f * t)
    plt.plot(t, sig, marker=".")
    plt.xlabel("t [sample]")
    plt.ylabel("signal [a.u.]")
    plt.figure()
    mics = automic(sig)
    plt.plot(mics)
    plt.xlabel("delay k [sample]")
    plt.ylabel("MIC")
    plt.show()

f:id:kazmus:20190217232923p:plain
上記プログラムでの入力信号

f:id:kazmus:20190217233012p:plain
計算された自己MIC(相互情報量)関数.入力された信号と遅延させた信号が同位相と逆位相の場合でMICが1に近づいているため,8回ピークがある.ただし,最後のピークは入力波形が短くなりすぎたためノイズが生じている.

matlabで振幅スペクトルの表示(fft)

matlab高速フーリエ変換し,振幅スペクトルを表示する.

function showfft(sig,fs)
%sig:信号.1次元配列
%fs:信号のサンプリング周波数
N=length(sig);   % 信号のサンプル数
plot(fs*(0:N-1)/N,abs(fft(sig)/N))   %振幅スペクトルの描画:縦軸が振幅,横軸が周波数
title('amplitude spectrum')
xlabel('frequency [Hz]')
ylabel('amplitude [a.u.]')
end

haskellで逆引き辞書ソート

単語を羅列したファイルから『逆引き広辞苑』みたいにソートする.

import System.IO

main :: IO ()
main = do
  hin <- openFile "test_words.txt" ReadMode  -- 読みこむファイル:単語リスト
  hout <- openFile "reverse_idx.txt" WriteMode  -- 書き込むファイル:逆引きソートした単語リスト
  contents <- hGetContents hin
  let
    rev_idx = reverseEachWords  -- もう一度各単語を逆にする. [[String]]
              $unduplicate  -- 単語リストをソートして↑ [[String]]
              $reverseEachWords  -- 単語リストの各単語を逆にして↑ [[String]]
              $words  -- 単語ごとにリストに分解して↑ [[String]]
              contents  -- 単語リストの文字列contentsを↑ [String]
  mapM_ (hPutStrLn hout) rev_idx
  hClose hout
  hClose hin
  


-- ソート,重複なくす
unduplicate::Ord a => [a] -> [a]
unduplicate []=[]
unduplicate (xs:xss)=unduplicate smaller++[xs]++unduplicate larger
  where
    smaller = [a | a <- xss, a < xs]
    larger  = [b | b <- xss, b > xs]


-- 単語リストの各要素にreverseを適用する
reverseEachWords :: [[a]] -> [[a]] -- [a]=String:1単語
reverseEachWords xs= map reverse xs

実行例

↓test_words.txt

alfabeta
alto
astrofisica
bistro
blanca
calimba
clasica
musica
temperatur
tenor
tradisional
traversa

上記プログラム実行後
↓reverse_idx.txt

calimba
clasica
astrofisica
musica
blanca
traversa
alfabeta
tradisional
bistro
alto
tenor
temperatur

参照ページ

ファイルの読み書きについて:
お気楽 Haskell プログラミング入門

reverse関数について:
reverse関数 - 結城浩のHaskell日記 - haskell

梱包テープでトイレ詰まりを解消する

下記の動画を参考にして,トイレ詰まりを解消できた.
突然トイレの流れが悪くなった 驚異のセロハンテープだけで直す方法!超簡単 - YouTube

方法

  • 念のため,「大」のレバーで水を流しても,水があふれない程度に水位を下げる(放置して水位が下がるのを待つか,便器から水をくむ).
  • 便器のふたと便座を上げる.
  • 便器のふちの水分や汚れを落とす(ふき取る程度).
  • 梱包テープで膜を作るよう便器に貼り,密封する.
    • 梱包テープは重なるように貼り,密封する.
  • 完全に密封したら,レバーを回し,水を流す.
  • 水が流れている間,便座内の圧力が上がり梱包テープの膜が膨らむが,手で押さえつける.
  • 水が流れ終えるころには,つまりが解消する.
  • 念のため,梱包テープをはがす前に1~3回水を流す.
  • 貼った梱包テープをすべてはがす.

問題の状況

詰まった原因はおそらく,トイレットペーパーを流しすぎたため.

以前も,トイレットペーパーを流しすぎて詰まったことがあったが,
トイレ内の水位が上がった状態で放置すれば,自然に解消していた.

しかし,今回は水を流して放置しても,解消しない状態が24時間以上継続した.
そのため,今回の方法を実行した.

詰まりの度合は,流れが完全に止まっていたわけではない.
ただし,便器の返し近くまで水位が上がっても,普通の水位に戻るまで30分~1時間かかっていた.
流れないため,実用できない状態だった.

他に試した対処

梱包テープを用いる以外の対処も試したが流れなかった.以下に示す.

  • ぬるま湯で流す.
  • キッチンハイターを入れる.
  • 酢を入れる.

使用したテープ

  • 3M ガムテープ 梱包テープ 重量用 48mm×50m カッター付 315DSN

Amazonで購入した.購入,到着してから4か月弱経過したものを使用した.
今回このテープで便器を密封する際は,隙間ができないように,テープ同士の一部が重なるように貼ったが,
このテープ自体の強度があったため,二重に貼らなくても問題なかった.

f:id:kazmus:20190120142557j:plain
梱包テープを便器に貼った状態.テープ同士の一部が重なるように貼った.この図では水を流し終えて,詰まりが解消した状態

Prilyさんの音列即興

音列: c g h
https://youtu.be/MEJs01hQVjI?t=1006

音列: h c f
https://youtu.be/MEJs01hQVjI?t=1114

音列: a h d
https://youtu.be/MEJs01hQVjI?t=1473

音列: d es g
https://youtu.be/MEJs01hQVjI?t=1729

音列: fis h a
https://youtu.be/MEJs01hQVjI?t=3249

音列: g cis fis
https://youtu.be/MEJs01hQVjI?t=5451

LCCのChart Aを理解したつもりになった過程

このサイト
コードで使うテンション(リディアン・クロマチック・コンセプト) : ジャズ理論
を読んで理解する予感を得て,原著を参照し一応理解した.
そして,soundquestのLCCのページを読んで,自身の理解と一致することを確認した.

さらに,原著のChart Aに,自身が理解した内容が含まれていることを確認し,
Chart Aが示すコードとスケールの対応の読み方が分かった.