ギター音スペクトル/ノイズ除去(レーザーピックアップ) | ..あちゃ! no mic's

..あちゃ! no mic's

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

SANTA no Mix

レーザーピックアップで読み取ったギター弦の音を高速フーリエ変換してみた。
ご覧のとおり、ソーラーパネルが定常ノイズ(ホワイトノイズ?)を発生させており、美しい、倍音効果は見られなかった(グラフ2)。

しかし、グラフ上でデータから、定常ノイズを削除してみると…グラフ3のように、ギター音らしきスペクトルが得られた。

下のグラフのグラフ2のスペクトル(生ギターの音源)と、上のグラフのグラフ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='test_guitar150915.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])
abs_spec = abs(spectrum[: L / 2 + 1])
noize_cut = half_spectrum

for num in range(0,512):
	if noize_cut[num] < 1000000.0:
#		abs_spec[num] = noize_cut[num]
		noize_cut[num] = 0

# 図を表示
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(abs_spec)
#pl.xlim([0, len(half_spectrum)])
pl.xlim([0, 1000])
pl.title("2. Spectrum", fontsize = 8)
fig.add_subplot(313)
pl.plot(noize_cut)
pl.xlim([0, 1000])
pl.title("3. Noize cut spectrum", fontsize = 8)

pl.show()