SuperColliderでサイン波の音を作成し、Pythonで解析してみた。
まず、音をSuperColliderで作った。
音源をWavで保存したのち、Python(プログラム1)で音の波形を確認した。
ところが、以下の波形。
なんか違う。
悩んだ末、ステレオとモノラルの違いでデータがうまく読み込めていないのが判明。
モノラルで音を録音し直して、出力。
うまくいった。
ところが、サンプリングのコツが呑み込めておらず、読み込んだデータのレンジが無茶苦茶なのに気づく。
しかし、レンジを合わせる術を知らず、やむなく、このデータでフーリエ変換とその逆変換を他人のサイトのプログラムを参考に、少しいじくって挑戦してみた(プログラム2)。
入力信号の波形と逆変換した波形は一致した。
それから、スペクトルは2つのピークを持っており、ちゃんと、2つの周期信号を捉えていることが分かる。
プログラム1
import wave import matplotlib.pyplot as plt import numpy as np filename = 'SC_150908_L_R.wav' wav_file = wave.open(filename,'rb') print wav_file.getnchannels() print wav_file.getframerate() print wav_file.getnframes() data = wav_file.readframes(wav_file.getnframes()) data = np.frombuffer(data,dtype="int16") #ary = np.fromstring(data,np.int16) #nz = np.nonzero(ary) plt.plot(data[79:279]) plt.show()
プログラム2
# -*- coding: utf-8 -*- from scipy import arange, hamming, sin, pi from scipy.fftpack import fft, ifft from matplotlib import pylab as pl import wave import scipy as sp fs = 8000 # Sampling rate L = 1024 # Signal length chunk=2048 filename1='SC_150908_mono.wav' wf1 = wave.open(filename1,'rb') data = wf1.readframes(chunk) sig=sp.fromstring(data,sp.int16) # フーリエ変換 spectrum = fft(sig) # 窓関数なし half_spectrum = abs(spectrum[: L / 2 + 1]) # フーリエ逆変換 resyn_sig = ifft(spectrum) # 図を表示 fig = pl.figure() fig.add_subplot(311) pl.plot(sig) pl.xlim([0, L]) pl.title("1. Input signal", fontsize = 8) fig.add_subplot(312) pl.plot(half_spectrum) pl.xlim([0, len(half_spectrum)]) pl.title("2. Spectrum", fontsize = 8) fig.add_subplot(313) pl.plot(resyn_sig) pl.xlim([0, L]) pl.title("3. Resynthesized signal", fontsize = 8) pl.show()
このあたりのことは、きちんとやるのに半年はかかりそう(オラの頭じゃ無理だって?)。
サンプリングレートがおおよそ、とりたい周波数の2倍ってこと頭に入ったから(どんだけ頭が悪いんだ)、音の加工に移りたい。
サラリと流しただけで、終わってしまう。
テーマ名も、大げさなので変えようかと思っている。

