エレキギターピックアップの周波数特性

# はじめに

　ギターのノイズを測りたいんだけど、その方法がわからないというお話をTwitterで受けました。ノイズは以前Qiitaには投稿していませんが一度測っており、もう一度同じことをするのもあれなので、今回はギターのピックアップの違いをターゲットにします。
 
　エレキギターは弦の振動をピックアップと呼ばれる装置で電気信号に変換しています。弦の振動を弦の端で拾うか（リアピックアップ）、弦の中心よりで拾うか（フロントピックアップ）で音色が変わります。耳で聴いて明らかに違いますが、周波数特性上ではどうなのかを見てみます。

# 使用機材・ソフト

ギター：YAMAHA RSS20
エフェクタ：BOSS GX-100
録音ソフト：Audacity

# 実験手順

ギターの音はGX-100のドライ出力で録音しました。実験手順は次の通りです。

1. 弦を手で抑え、静かにした状態で60秒間録音し暗騒音を記録する。
1. 6弦から1弦までピックで同時に5秒間ほど鳴らす。これを10回繰り返す。
1. ピックアップを切り替えて1,2の手順を繰り返す。

人の手で弾く限り毎回同じピッキングとならないことから10回繰り返して解析時に平均化します。
それと本当は弦ごとにやったほうが良いかもしれませんが、6つの弦それぞれやるのは面倒だったため同時です。

# 解析

ピックが弦にあたる瞬間は特にばらつきが大きいので、その瞬間から1秒経ったくらいのところから3秒間を切り出しました。
FFTする際にデータ長すべてを使うと周波数分解能をあげられますが、今回はそれより縦軸のばらつきを抑えるために時間窓を短く取って平均化の回数を稼いだほうが良いのでそうします[^1]。

サンプリングレート：48kHz
FFTサンプル点数：8192点
周波数分解能：5.86Hz
平均化回数：約170回　(30秒のデータを時間窓0.17秒でFFT)
窓関数：矩形

```python
import numpy as np
import matplotlib.pyplot as plt
from pathlib import Path
from scipy.io import wavfile

# このディレクトリ下に1.wav, 2.wavのように切り出した音源を格納してある
frontPU_dir = Path(r"C:\Users\myb\Desktop\ギターピックアップごとの周波数特性\フロントピックアップ切り出し")
rearPU_dir = Path(r"C:\Users\myb\Desktop\ギターピックアップごとの周波数特性\リアピックアップ切り出し")
# 暗騒音
frontPU_bg_path = Path(r"C:\Users\myb\Desktop\ギターピックアップごとの周波数特性\フロントピックアップ_暗騒音.wav")
rearPU_bg_path = Path(r"C:\Users\myb\Desktop\ギターピックアップごとの周波数特性\リアピックアップ_暗騒音.wav")


def average_fft(sig_array,fs,n=8192):
    """
    平均化FFT
    sig_array : numpy array 解析対象のデータ
    fs : float サンプリングレート Hz
    n : int FFTのサンプル点数
    """
    ave_num = len(sig_array) // n #平均化回数
    freq = np.fft.rfftfreq(n,1.0/fs)
    ave_fft = np.zeros(len(freq),dtype=np.float64)
    for i in range(ave_num):
        fft = np.abs(np.fft.rfft(sig_array[n*i:n*(i+1)]))
        ave_fft += fft / ave_num

    return freq, ave_fft, ave_num


def wavfiles_average_fft(wav_path_list,n=8192):
    """
    切り出した複数のwavファイルを使って平均化FFTを行う
    wav_path_list : pathlib.WindowsPathのリスト
    n : int FFTのサンプル点数
    """
    all_ave_num = 0 #すべてのファイルを使って行った平均化回数
    all_ave_fft = np.zeros(n//2+1,dtype=np.float64)
    file_num = len(wav_path_list)
    
    for wav_path in wav_path_list:
        sampling_rate, sig_array = wavfile.read(wav_path) #モノラル前提
        freq, ave_fft, ave_num = average_fft(sig_array,sampling_rate,n)
        
        all_ave_num += ave_num
        all_ave_fft += ave_fft / file_num
    
    return freq, all_ave_fft, all_ave_num

# 平均化FFTの実行
freq, ave_fft_frontPU, all_ave_num_frontPU = wavfiles_average_fft(list(frontPU_dir.glob("*.wav")))
freq, ave_fft_frontPU_bg, all_ave_num_frontPU_bg = wavfiles_average_fft([frontPU_bg_path])

freq, ave_fft_rearPU, all_ave_num_reartPU = wavfiles_average_fft(list(rearPU_dir.glob("*.wav")))
freq, ave_fft_rearPU_bg, all_ave_num_rearPU_bg = wavfiles_average_fft([rearPU_bg_path])


# グラフ描画
fig,axes = plt.subplots()
axes.plot(freq,20.0*np.log10(ave_fft_frontPU),label="frontPU",alpha=0.8)
axes.plot(freq,20.0*np.log10(ave_fft_rearPU),label="rearPU",alpha=0.8)
axes.plot(freq,20.0*np.log10(ave_fft_frontPU_bg),label="frontPU bg",alpha=0.8)
axes.plot(freq,20.0*np.log10(ave_fft_rearPU_bg),label="rearPU bg",alpha=0.8)

axes.set_xscale("log")
axes.set_xlim(20.0,10.0e3)
axes.set_xlabel("Frequency Hz")
axes.set_ylabel("Amplitude dB")
axes.legend(loc="best")
fig.savefig("フロントリアPU比較_暗騒音込.png",dpi=400)

# 差分グラフ描画
fig,axes = plt.subplots()
axes.plot(freq,20.0*np.log10(ave_fft_rearPU)-20.0*np.log10(ave_fft_frontPU),label="rearPU - frontPU",alpha=0.8)
axes.axhline(0, color='gray', linestyle='--')
axes.axvline(440.0, color='gray', linestyle='--', label="440 Hz")


axes.set_xscale("log")
axes.set_xlim(20.0,10.0e3)
axes.set_xlabel("Frequency Hz")
axes.set_ylabel("Amplitude dB")
axes.legend(loc="best")
fig.savefig("フロントリアPU差分.png",dpi=400)
```

# 結果

横軸が周波数、縦軸が振幅です。振幅の絶対値に意味はありません。相対比較のみです。
青色がフロントピックアップ、オレンジ色がリアピックアップです。暗騒音由来のピークなどがないか確認するために一緒に描画してありますが、そうすると縦軸の1マスが20dBという大きな刻みになってしまってよくわからないですね・・・

![フロントリアPU比較_暗騒音込.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455608/378e459c-f705-5c73-90a1-773a79a2c81b.png)


ということで差分を取って比較します。リアピックアップからフロントピックアップを引いた差分です。
A特性をかけたりOASPLを揃えるなどしていないので、聴覚上の感覚と一致するかどうかはなんとも言えず参考程度ですが、0dBを超えるところはリアピックアップが強く、反対に0dBを下回るところはフロントピックアップが強い成分だと考えられます。
周波数軸のどこがどの音かわかりにくいのでチューニングの基準となる440Hzを縦の点線で描画しています。



![フロントリアPU差分.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455608/b3731a69-bf4b-af36-3699-cd826d90a0f3.png)

200Hz以下くらいの比較的低い周波数帯ではフロントピックアップのほうが強く、200～400Hzくらいと800Hz以上の周波数帯はリアピックアップのほうが強いとわかります。
それと800Hz以上で大きなピークがありますが、このグラフは差分を表していて、全体の図のほうで見ればその部分は100Hz付近のピークから20dB以上小さい成分であることにご注意ください。

聴覚上の感覚だと、フロントピックアップは低音よりの柔らかい音色で、リアピックアップは硬い音色な印象を受けますが、周波数特性からもなんとなくその傾向がわかるかな？って雰囲気です。

# まとめ

エレキギターのピックアップによる音色の違いを周波数特性で比較して確認しようと試み、聴覚上の感覚と、周波数特性とでそれほど大きな乖離はなさそうだということがわかりました。

今回はギターのピックアップを対象にしましたが、それ以外の騒音測定でも使える手順と思いますので、何かの参考になれば幸いです。

[^1]: [株式会社小野測器: 計測コラム emm152号用 基礎からの周波数分析(15) - パワースペクトル(その3)](https://www.onosokki.co.jp/HP-WK/eMM_back/emm152.pdf)