フーリエ変換と逆変換(スペクトル成分を調べる) | ..あちゃ! no mic's

..あちゃ! no mic's

クラウドファンディング予定~2026年度
何度でもチャレンジ!
ただいまソーラーピックアップのテスト中

SANTA no Mix

SuperColliderでサイン波の音を作成し、Pythonで解析してみた。

まず、音をSuperColliderで作った。


振幅0.1、周波数440Hzと880Hzの音を出力した。


合成波が以下の形。


音源を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倍ってこと頭に入ったから(どんだけ頭が悪いんだ)、音の加工に移りたい。
サラリと流しただけで、終わってしまう。
テーマ名も、大げさなので変えようかと思っている。