12月第1週の振り返り

12月第1週(12/2-12/8)

フランス法文献講読

patrimoine: (個人の)資産・遺産、(社会的な)遺産

fixer: 約定する(・固定する)

liquidité: 流動資産

cession: 譲渡(消極財産=負債についても同じ語が用いられる)

フランス民法典(2016年改正後)では、契約の解釈について指示を与えている。例えば1188条前半では


Le contrat s'interprète d'après la commune intention des parties plutôt qu'en s'arrêtant au sens littéral de ses termes.

契約は、その文言の字義に拘泥するよりもむしろ、当事者共通の意図に従って解釈される。

と規定されている。日本法でも当事者の意思を推定することは行われているが、それが明示的に指示されているというのは一つの違いとして存在する。

担保物権

約定担保物権である質権に対して、法定担保物権としては民事・商事留置権がある。他人の物を現に占有していて、その物に関して生じた(牽連性がある)債権を有している場合に、物を留置することで弁済を促す。商事留置権では商人間の継続的取引を念頭に、牽連性を問わず債務者の所有する物を留置できる(売掛金弁済まで借地を返還せず留置など)。留置物は保存に必要な使用・債務者の承諾に基づく使用であれば可能だが、無断使用や賃貸は認められない。優先弁済効もない(ただし競売にかけて換価金返還または被担保債権との相殺ができる)。

分割債務においては債務者各人の負う債務は自己のものだけで、債権者は各々の債務の履行を当該債務者以外に求めることはできない。これを法令・特約によって連帯債務とすると、債権者は債務者の誰に対しても全部履行の請求が可能である。その債務者は全部履行を行った後、他の債務者に対して負担割合に応じた求償権を有する。

不可分債務は物理的に債務の内容が不可分である場合(自動車の共同購入)と、平等の観点(共同相続した賃借権で、賃借人としての地位は分割できないのに、分割債務を認めると各々半額しか払わなくてよくなる)から不可分とすべき場合があった。

しかし潮見によれば債権法改正後は絶対的効力事由が連帯債務と同一になった(連帯債務の絶対的効力事由が削減された―履行の請求によって生じる消滅時効の中断や履行遅滞の効果は他の債務者に及ばなくなる、債務者一人に対し債務を免除しても他の債務者に請求できる額は変わらなくなる)ため、後者の場合は単に連帯債務とすれば足りるという。

つまり従来は不可分債務と可分債務の間に連帯債務があり、この連帯債務には債権者側(免除が他の債務者にも影響)にも債務者側(あずかり知らぬ履行遅滞)にも不都合な点があったが、これらの点を解消したことで不可分債務と連帯債務とは名称の違いだけとなり、物理的に不可分なら不可分債務、そうでなければ連帯債務と呼ぶことになったと私は理解する。

また改正により、連帯債務で一部弁済を行った場合には自己負担部分を超えなくても求償可能になった。仮に100万円の連帯債務をA, Bが半分ずつ負担しているとき、Aが50万円の一部弁済を行っても、残りの50万円についてなお請求を受けうるが、改正前では求償ができるのはさらなる弁済を行ってからになる。改正後では一部弁済の段階で求償できるので、より公平であり、また履行の促進につながるとされる。

並列プログラミング

Cannonのアルゴリズムを用いて、分散して個別メモリに持っている部分的な配列を隣接するPEと送受信する。

各PEは行を分担して対角成分から計算を始める。計算が完了したら行列Cにおける行方向に移動して新たな部分の計算を行う。そのためには一つ右のPEが持っているBの列を使う必要があるため受信する。また左のPEは自分が持っているBの列を必要とするので送信する。これをPEの数ぶん繰り返す。

MPI_Recv/MPI_Sendはブロッキング処理なので、全PEにおいてMPI_SendしてからMPI_Recvするように書くとどのPEも受信待機になっておらず永久に送信が完了しない。そのため偶数PEではSend-Recv、奇数PEではRecv-Sendとする必要がある。ノンブロッキング処理であるMPI_ISendもあるが、それは後日扱われる。

法医学

入浴中の死亡原因究明によって給湯器の欠陥などが判明するように、死因究明制度は消費者安全とも関わっている。

死亡、30日以上の傷病、一酸化炭素中毒、火災は消費者事故における重大事故と位置付けられ、製造者・輸入者また行政機関の長は直ちに報告する義務を負う。

死因・身元調査法では、死因の究明によって同種の被害が起きうることが分かった場合に関係機関に通報することとなっている(不慮の外因死の中に消費者事故が含まれていることがある)。

メディアプログラミング

今週は音声信号処理ということでまず音に関する座学を行い、その後pyaudio/wave/numpy/librosaを用いて演習を行った。

音の聞こえ方について、あぶみ骨からの距離によって対応する音の周波数が変わってくるが、高音になるほど広い音の高さをわずかな距離で感じ取っているため聞き分けが難しくなる。とはいえ高周波数の音をカットするとこもった音になる。人間の発話の場合、一般に4KHz以下の音があれば内容を聞き取ることができるとされる。

周波数情報を保って収録するためには、サンプリング周波数Fは収録したい音の高さ=最大周波数 f_{max}Hzの二倍以上必要(標本化定理)である。これは周波数 fの音は周波数 F-fHzの音と区別ができない(折り返し雑音=エイリアシング)ことに由来する。収録できないというわけではないので注意。そのため f_{max}Hz以上の音を除去する(高音ノイズを入れてしまうと低音と区別ができないので)ローパスフィルタを通した音を 2f_{max}Hz以上でサンプリングし収録する。理想的なローパスフィルタを通すとナイキスト周波数以上の音は存在しないので、収録した信号を用いてその帯域制限を満たす信号=元の波形が一意に定まり復元できる。

ビット深度は音をデジタル信号として記録するにあたって振幅(音の大きさ)を離散化(量子化)するときの階調の細かさに影響する。2ビットであれば、0-1-2-3であるから基準の大きさ2から正負1段階、すなわち2階調しか表現できないことになる。このようにビット深度が小さい(すなわち表現できる最大音量と最小音量の差=ダイナミックレンジ=信号波と量子化ノイズの比が小さいことになる)と、音圧記録時の丸め誤差によって各時点で本来と異なる音圧に復元されて表現されることとなり、ノイズとして感じられるようになる。

普段目にするdBは相対的な音の強さであり、絶対的な音圧はdB SPLとして騒音計で計測される。騒音計の計測モードには複数の特性があり、A特性は人間の聴覚特性に類似するように重みづけして評価する。

人間の聴覚では位相のずれを区別できない。しかし逆フーリエ変換で周波数領域(ある時点における周波数ごとの振幅の大きさ)から時間領域(時間経過による振幅の変化)に戻す際には位相の情報が必要になる。

どの母音かは周波数スペクトルのなだらかな(大局的な)変動であるスペクトル包絡のピーク(フォルマント)位置によって区別できる。

pyaudioではファイルストリームに送るチャンクサイズを変更することで「バッファリングが間に合わない」現象を再現し、途切れ途切れに再生されることを確認した。

import pyaudio

wavfile = wave.open(filepath, 'rb')
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wavfile.getsampwidth()),
                channels=wavfile.getnchannels(),
                rate=wavfile.getframerate(),
                output=True)

chunk_size = 16

data = wavfile.readframes(chunk_size) # chunk_sizeフレーム分取得する
while len(data) > 0:
    stream.write(data)
    data = wavfile.readframes(chunk_size) # 次のチャンクを取得
    
stream.stop_stream()
stream.close()
p.terminate()

高速フーリエ変換はnumpyで提供されている。波形を周波数成分に分解するのは以下のようになる。

wavfile = wave.open(filepath, 'rb')
x = wavfile.readframes(wavfile.getnframes())
sampling_rate = wavfile.getframerate()
sample_size = wavfile.getsampwidth()  # サンプル幅(byte)
wavfile.close()

x = np.frombuffer(x, dtype= "int16")
x = x/(2**(8 * sample_size) / 2)  # 振幅の正規化

X = np.fft.fft(x)

amplitude = 20*np.log10(np.abs(X))  # 相対音圧で算出
x_axis = np.fft.fftfreq(len(X), d=1.0/sampling_rate)  # len(X)で得られるのはビン数なので、周波数の値に変換する
ax.plot(x_axis[0:int(len(X)/2-1)], amplitude[0:int(len(X)/2)-1])  # ナイキスト周波数以上は省略したい

周波数分解は時間によって周波数成分が変化しない音の分析には適するが、高低が変化する音楽では時間によって変化する周波数成分が全て混ざって分析されてしまう。そのためある瞬間の音(1サンプル)だけで分析したいところであるが、それは不可能なのでごく短時間で区切った上で前後の波形の影響を弱める手法をとる。これを短時間フーリエ変換(STFT)と呼ぶ。matplotlibには時間経過による周波数成分の変化をグラフにするスペクトログラム描画機能がある。

wavfile = wave.open(filepath, 'rb')
x = wavfile.readframes(wavfile.getnframes())
x = np.frombuffer(x, dtype= "int16")
sampling_rate = wavfile.getframerate()
wavfile.close()

N = 512  # フレーム幅
hamming_window = np.hamming(N)

plt.specgram(x, NFFT=N, Fs=sampling_rate, noverlap=0, window=hamming_window)

パワースペクトルの大域的な動きの特徴をケプストラム特徴といい、人間の周波数感度を模したメルフィルタを通して特徴量を描画したものがメル周波数ケプストラム係数(MFCC)となる。

import librosa
import librosa.display

y, sr = librosa.load(filepath, sr=sampling_rate)
mfcc = librosa.feature.mfcc(y, sr=sr)

librosa.display.specshow(mfcc, sr=sr, x_axis='time', vmax = 100, vmin = -600)

色の分布が男性と女性、ピアノとヴァイオリンなどで異なっていることが分かった。