PythonによるSTFT等で利用する窓関数の比較

# はじめに
出来る限り公式ドキュメントに従った実装を心掛けていますが、不慣れなところは見逃していただけると幸いです。

# 概観
#### 短時間フーリエ変換
[<u><font color="Blue">PythonによるFFTを用いたパワースペクトル推定</font></u>](https://qiita.com/uene/items/8210234cb183851552da)では、時間領域信号をすべて周波数領域信号へ変換してその信号の性質を明らかにしようとする場合に用いられる[<u><font color="Blue">パワースペクトル</font></u>](https://www.wavemetrics.com/products/igorpro/dataanalysis/signalprocessing/powerspectra)について解説しました。しかし、音声・音楽など時間とともに変化する信号を解析する際には時間情報も重要な情報です。そのように時間情報、周波数情報の二つの情報をある一つの信号から抽出する際に用いられる解析を[<u><font color="Blue">短時間フーリエ変換</font></u>](https://ccrma.stanford.edu/~jos/sasp/Time_Frequency_Displays.html)と呼びます。
> パワースペクトルを求めることをスペクトル解析と呼ばれることが多いです。[^1]

#### 窓関数
[<u><font color="Blue">短時間フーリエ変換</font></u>](https://ccrma.stanford.edu/~jos/sasp/Time_Frequency_Displays.html)(以下、[<u><font color="Blue">STFT</font></u>](https://ccrma.stanford.edu/~jos/sasp/Time_Frequency_Displays.html))については別記事にて解説しますが、[<u><font color="Blue">STFT</font></u>](https://ccrma.stanford.edu/~jos/sasp/Time_Frequency_Displays.html)では[<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)という関数が重要です。今回はそんな[<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)に焦点を当てた記事を書きます。一般的な信号処理の教科書には[<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)についてページが割り当てられていますが、それらの[<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)はせいぜい[<u><font color="Blue">blackman</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.blackman.html#scipy.signal.windows.blackman), [<u><font color="Blue">hann</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.hann.html#scipy.signal.windows.hann),[<u><font color="Blue">hamming</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.hamming.html#scipy.signal.windows.hamming)ウィンドウぐらいしか解説されていません、僕の学校の授業でもそんな感じでした。他にもたくさんあるはずですし、何なら特徴を数値的に表現して使い分けができるようになりたいです。この記事ではそんなことができるようになれたらなと思いながら書きました。

[<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)の主な利用方法は簡単で、ある信号に対して要素積をとるだけです。例えばある信号$x(t)$に対して[<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)$w(t)$をかけた(適用した)後の関数$y(t)$それらの関係式は以下のようになります。

```math
y(t) = w(t)x(t)
```
ここで、ある信号$x(t)$をフーリエ変換したことを$X(\omega)=\mathcal{F}\[x(t)\]$と記述することにします。また、ある信号$X(\omega)$を逆フーリエ変換したことを$x(t)=\mathcal{F^{-1}}\[X(\omega)\]$と記述することにします。今から、

```math
Y(\omega) = \frac{1}{2\pi} \int_{-\infty}^{\infty} W(\omega-\omega') X(\omega') d\omega' = \frac{1}{2\pi} \int_{-\infty}^{\infty} W(\omega') X(\omega-\omega') d\omega'
```
が成立した時それぞれ$x(t)$、$w(t)$、$y(t)$にはある信号$x(t)$に対して[<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)$w(t)$をかけた(適用した)後の関数$y(t)$であるという関係つまり、$y(t) = w(t)x(t)$が成立していることを示します。

```math
\begin{align}
y(t) = \frac{1}{2\pi} \int_{-\infty}^{\infty} Y(\omega) e^{j\omega t}d\omega &= \frac{1}{2\pi} \int_{-\infty}^{\infty} \frac{1}{2\pi} \int_{-\infty}^{\infty} W(\omega-\omega') X(\omega') d\omega' e^{j\omega t}d\omega\\
&= \frac{1}{2\pi} \int_{-\infty}^{\infty} \frac{1}{2\pi} \int_{-\infty}^{\infty} W(\omega-\omega') X(\omega') d\omega' e^{j(\omega-\omega') t} e^{j\omega' t} d\omega\\
&= \frac{1}{4\pi^2} \int_{-\infty}^{\infty}\int_{-\infty}^{\infty} W(\omega-\omega') e^{j(\omega-\omega') t} X(\omega') e^{j\omega' t} d\omega' d\omega\\
&= \frac{1}{4\pi^2} \int_{-\infty}^{\infty} W(\omega-\omega') e^{j(\omega-\omega') t} d\omega \int_{-\infty}^{\infty}  X(\omega') e^{j\omega' t} d\omega'\\
&= \frac{1}{4\pi^2} \int_{-\infty}^{\infty} W(\beta) e^{j\beta t} d\beta \int_{-\infty}^{\infty}  X(\omega') e^{j\omega' t} d\omega'\\
&= \frac{1}{2\pi} \int_{-\infty}^{\infty} W(\beta) e^{j\beta t} d\beta \frac{1}{2\pi} \int_{-\infty}^{\infty}  X(\omega') e^{j\omega' t} d\omega'\\
&= w(t)x(t)
\end{align}
```
ちなみに以上の式変形から逆も成立します。上記の関係式から以下のことが言えます。

:::note
時間領域で窓関数をかけるということは、周波数領域で畳み込み積分を行うということである。
:::
また[<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)を意識しない（$w(t) = 1$の場合、一般的に矩形窓と表現されます。）も周波数領域では$W(\omega)$の畳み込みになっています。なので$W(\omega)$の性質をしっかりと把握したうえで$w(t) = 1$という窓を用いるのか、もしくはその他の窓を用いるのかを考えるべきです。

# 窓の特徴について
<a title="余者と, CC BY-SA 3.0 &lt;http://creativecommons.org/licenses/by-sa/3.0/&gt;, via Wikimedia Commons" href="https://commons.wikimedia.org/wiki/File:Main_lobe.png"><img alt="Main lobe" src="https://upload.wikimedia.org/wikipedia/commons/f/f7/Main_lobe.png">

Wikipediaに非常に良い画像があったので拝借しましたが、[<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)の性質は大きく以下の三つの要素によって変わります。

1. メインローブの大きさ(正確には違います。)
1. メインローブの太さ
1. サイドローブの大きさ(正確には違います。)

# 窓関数一覧
今回は[<u><font color="Blue">scipy.signal.windows</font></u>](https://docs.scipy.org/doc/scipy/reference/signal.windows.html)に実装されている[<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)の中から、いくつかの例をあげてその[<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)のパワースペクトル(ただし、図において縦軸が$dB SPL$でないことに注意してください)を見てみることにします。
> 正確な話をすると、これ以降の図はすべてメインローブの大きさを基準とした(最大値を基準とした)デシベル値なのでサイドローブレベルが前述のメインローブの大きさに対応していると考えてください。

## [<u><font color="Blue">cosine</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.cosine.html#scipy.signal.windows.cosine) : window with a simple cosine shape
![cosine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/1c0c9050-bccd-0d62-6bed-625cbd67be24.png)
## [<u><font color="Blue">blackman</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.blackman.html#scipy.signal.windows.blackman) : Blackman window
![barthann.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/9f9f6877-d854-609e-b11e-c1656ec4d098.png)
## [<u><font color="Blue">hann</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.hann.html#scipy.signal.windows.hann) : Hann window
![hann.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/558cc8fb-edc6-0199-c8c6-2f2289f623ad.png)
## [<u><font color="Blue">hamming</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.hamming.html#scipy.signal.windows.hamming) : Hamming window
![hamming.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/0a51a518-a818-7b99-47c7-59edb9e2d0d1.png)
## [<u><font color="Blue">blackmanharris</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.blackmanharris.html#scipy.signal.windows.blackmanharris) : minimum 4-term Blackman-Harris window
![blackmanharris.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/22b42b20-a5f0-46b3-2702-8e6e30c71c21.png)
## [<u><font color="Blue">nuttall</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.nuttall.html#scipy.signal.windows.nuttall) : minimum 4-term Blackman-Harris window according to Nuttall
![nuttall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/c8b49b1e-e220-a297-6943-96f919d649d8.png)
## [<u><font color="Blue">flattop</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.flattop.html#scipy.signal.windows.flattop) : flat top window
![flattop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/4b96f494-c95e-e25c-5993-915b5d961441.png)


# 考察
いかがでしょうか、見た感じ窓には二種類あるような気がします。

パターン1. サイドローブレベルは小さいが、中心周波数($0 kHz$)から離れるほどサイドローブが急激に小さくなる。
パターン2. サイドローブレベルは大きいが、中心周波数($0 kHz$)から離れてもサイドローブの大きさは変化しない。

[<u><font color="Blue">cosine</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.cosine.html#scipy.signal.windows.cosine), [<u><font color="Blue">blackman</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.blackman.html#scipy.signal.windows.blackman), [<u><font color="Blue">hann</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.hann.html#scipy.signal.windows.hann)ウィンドウはパターン1に該当するような気がしませんか？そして、[<u><font color="Blue">hamming</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.hamming.html#scipy.signal.windows.hamming), [<u><font color="Blue">blackmanharris</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.blackmanharris.html#scipy.signal.windows.blackmanharris), [<u><font color="Blue">nuttall</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.nuttall.html#scipy.signal.windows.nuttall), [<u><font color="Blue">flattop</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.flattop.html#scipy.signal.windows.flattop)ウィンドウはパターン2に該当するような気がしませんか？この種類の分け方は僕が勝手に見た目で分けただけなので学術的には何かしら用語があるかもしれません(ないかもしれません笑)。とりあえず、この記事では窓の特徴を数値的に判断し、現行[<u><font color="Blue">scipy</font></u>](https://docs.scipy.org/doc/scipy/reference/index.html)に実装されている[<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)の使い分けができるようにすることを目標にしましょう。

ここで、どんな値を計算したら窓の特徴を分析したことになるでしょうか？この記事では以下の数値を計算することにします。

1. メインローブの幅(以下、メイン幅) [単位 : $Hz$]
1. メインローブのサイドローブの大きさの差(以下、サイドローブレベル) [単位 : $dB$]
1. サイドローブの平均値 [単位 : $dB$]

# 前提
#### 図について
Googleで検索していただければわかりますが、基本的には$dB$に変換して表示してある図がほとんどです。たまに、フーリエ変換しただけの図を掲載しているサイトもあります。正直言って、どっちが良いのかはわかりません多分趣味だと思います。ここで、フーリエ変換しているだけの図を掲載する意味としては、[<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)は「周波数領域で畳み込み積分を行う」ということなので、[<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)はフィルタであるという解釈も出来ます。なので、フィルタとして考えるときは、そのまんまの複素振幅スペクトルの方が分かりやすいかもしれません。

しかし、前述の通り[<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)は[<u><font color="Blue">短時間フーリエ変換</font></u>](https://ccrma.stanford.edu/~jos/sasp/Time_Frequency_Displays.html)で用いられることが多いです。その場合は大きさを$dB$に変換する場合がほとんどですし、周波数の分解能を考慮して窓を選択するはずです。ここで重要なのがメインローブ、サイドローブの大きさと幅です。それらがわかりやすいのはやはり本記事で採用しているような***メインローブを基準として***$dB$変換を行った図($dB SPL$は最小可聴音を基準として$dB$変換を行ってます)だと考えます。本記事の図が$dB$に変換して表示しているのはそのためです。

#### 図を生成する際の注意点
- [<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)の信号点数は$2^7 = 128$点で生成しています。
- サンプリング周波数は$44.1kHz$として計算しています。
- 上記の条件で計算すると、約$0.003$秒間の信号として得ることができます。
> また、パワースペクトルの分解能(周波数ビンと呼ばれる場合もありますが、本記事ではパワースペクトルの分解能と表現します)は約$344Hz$です。信号点数を $2^{20} \simeq 1050000$ 点にした場合、約24秒の信号として得ることができ、周波数分解能は約$0.04Hz$です。

- 上記のパワースペクトルの分解能が低下する問題を解決するために、[<u><font color="Blue">scipy.fft.fft</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.fft.fft.html#scipy.fft.fft)にも記されている通りに、[<u><font color="Blue">zeros padding</font></u>](https://ccrma.stanford.edu/~jos/sasp/Zero_Padding_Interpolating_Spectral_Displays.html)[^2]を行います。今回はパワースペクトルの分解能が$1Hz$になるように要素数を指定しました。
> If it is larger, the input is padded with zeros. If n is not given, the length of the input along the axis specified by axis is used.

- メインローブの大きさは、最も大きい値なので`np.max(np.abs(c))`によって算出しています。

# ローブの大きさ
それぞれメインローブとサイドローブ(以下、ローブ)の大きさを算出する際はどのようにしたらよいでしょうか？図を見ればわかる通り、ローブの頂点は極大値であるはずです。極値は一般的に一階微分の正負が反転する場所に現れます(いつか数学的なテクニックをまとめてみたいですね)。[<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)の変化は周波数によって変化しています。なので、[<u><font color="Blue">窓関数</font></u>](https://ccrma.stanford.edu/~jos/sasp/Spectrum_Analysis_Windows.html)を$W(\omega)$つまり、周波数によって変化する一変数関数と考えて極値の分布を考えます。

以上を踏まえて、極値のインデックスを求めるための関数を以下ののように定義しました。また、[<u><font color="Blue">cosine</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.cosine.html#scipy.signal.windows.cosine)ウィンドウの極値をプロットした場合を例にして表示てみます。
> 私は数学が得意ではないので、詳しい説明は数学が得意な人に聞いてみてください。

```python
def get_extremum_idx(y:np.array) -> np.array :
    diffY = np.diff(y)
    diffY_sign = np.sign(diffY)
    diffY_sign_diff = np.diff(diffY_sign)
    diffY_sign_diff_abs = np.abs(diffY_sign_diff)
    return np.where( diffY_sign_diff_abs==np.max(diffY_sign_diff_abs) )[0] + 1
```

## [<u><font color="Blue">cosine</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.cosine.html#scipy.signal.windows.cosine) : window with a simple cosine shape
![cosine_extremum.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/d4888255-a83b-d050-6ad3-f4712e7edc2d.png)

## パワースペクトルの対称性
$y(t)\in \mathbb{R}$をフーリエ変換した際の、結果を$\mathcal{F}[y(t)]=Y(\omega)$とします。ここで、$\mathcal{F}[y(t)]=Y(\omega)=\mathrm{Re}(\omega)-i\mathrm{Im}(\omega)$と表現できるとします。$y(t)\in \mathbb{R}$なので、$\omega>0$について

```math
\begin{align}
\mathrm{Re}(\omega) &= \int_{-\infty}^{\infty} y(t) \cos(\omega t) dt \\
\mathrm{Im}(\omega) &= \int_{-\infty}^{\infty} y(t) \sin(\omega t) dt
\end{align}
```
となります。ここで、

```math
\begin{align}
\mathrm{Re}(-\omega) &= \int_{-\infty}^{\infty} y(t) \cos(-\omega t) dt = \int_{-\infty}^{\infty} y(t) \cos(\omega t) dt = \mathrm{Re}(\omega) \\
\mathrm{Im}(-\omega) &= \int_{-\infty}^{\infty} y(t) \sin(-\omega t) dt = -\int_{-\infty}^{\infty} y(t) \sin(\omega t) dt = - \mathrm{Im}(\omega)
\end{align}
```
よって、

```math
Y(-\omega)=\mathrm{Re}(-\omega)-i\mathrm{Im}(-\omega)=\mathrm{Re}(\omega)+i\mathrm{Im}(\omega)=\overline{Y(\omega)}
```
また、

```math
\mathrm{ABSOLUTE}(Y(-\omega)) = \sqrt{ \mathrm{Re^2}(\omega) + \mathrm{Im^2}(\omega) } = \mathrm{ABSOLUTE}(Y(\omega))
```
ただし、

```math
Y(0) = \int_{-\infty}^{\infty} y(t) e^{j0 t}dt = \int_{-\infty}^{\infty} y(t)dt
```
なので、$y(t)\in \mathbb{R}$をフーリエ変換した際、パワースペクトルは$0Hz$を除いて正負で対称であることがわかります。

:::note
パワースペクトルは0Hzを除いて正負で対称である。
:::

# 特徴の計算
ローブの極値を求めることが出来たので、特徴的な値を求めます。それぞれの値の定義は下の図を参照してください。また、コーディングする際、対称性を考えて今後の値を求めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/f6225191-63a9-ceca-695e-ea7670b3833a.png)
つまり、サイドローブの平均値を求める際は、下の図に示した黒い点の値を求めることになりますね。
## [<u><font color="Blue">cosine</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.cosine.html#scipy.signal.windows.cosine) : window with a simple cosine shape
![cosine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/d4aaf86f-0c24-a8a0-5b76-ec9a98254b9d.png)


## 結果
|  &nbsp;&nbsp;窓関数&nbsp;&nbsp;  |  メイン幅[kHz]  |  サイドローブレベル[dB]  |  サイドローブの平均値[dB]  |
| :---: | :---: | :---: | :---: |
| [<u><font color="Blue">cosine</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.cosine.html#scipy.signal.windows.cosine) | 1.04 | 23.00 | -72.43 |
| [<u><font color="Blue">blackman</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.blackman.html#scipy.signal.windows.blackman) | 2.09 | 96.22 | -106.29 |
| [<u><font color="Blue">hann</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.hann.html#scipy.signal.windows.hann) | 1.39 | 31.47 | -97.64 |
| [<u><font color="Blue">hamming</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.hamming.html#scipy.signal.windows.hamming) | 1.40 | 45.37 | -54.20 |
| [<u><font color="Blue">blackmanharris</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.blackmanharris.html#scipy.signal.windows.blackmanharris) | 2.78 | 99.86 | -113.30 |
| [<u><font color="Blue">nuttall</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.nuttall.html#scipy.signal.windows.nuttall) | 2.81 | 105.97 | -100.10 |
| [<u><font color="Blue">flattop</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.flattop.html#scipy.signal.windows.flattop) | 3.52 | 108.27 | -94.83 |

# さいごに
表の結果から、[<u><font color="Blue">blackmanharris</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.blackmanharris.html#scipy.signal.windows.blackmanharris)、[<u><font color="Blue">nuttall</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.nuttall.html#scipy.signal.windows.nuttall) 、[<u><font color="Blue">flattop</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.flattop.html#scipy.signal.windows.flattop)が良い結果を出せそうな気がします。そこで、それぞれの特性を棒グラフで比較してみましょう。
#### メイン幅の比較～小さければ小さいほど良い～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/72f80ebf-8ca7-44a6-c7b6-b5fb4d036578.png)

#### サイドローブレベルの比較～大きければ大きいほど良い～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/684bee4d-8253-7de3-4834-c387112592f3.png)

#### サイドローブの平均値の比較～小さければ小さいほど良い～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/8a7816b7-dda3-a98f-8ce1-5cb7aa8a33ae.png)

これらの結果から、基本的には[<u><font color="Blue">blackmanharris</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.blackmanharris.html#scipy.signal.windows.blackmanharris)を使えば問題はなさそうですが、サイドローブレベルにこだわりを持つ場合は[<u><font color="Blue">nuttall</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.nuttall.html#scipy.signal.windows.nuttall) 、[<u><font color="Blue">flattop</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.flattop.html#scipy.signal.windows.flattop)を利用することも検討するべきかもしれません。

# 番外編～紹介しきれなかった窓たち～
## [<u><font color="Blue">barthann</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.barthann.html) ：a modified Bartlett-Hann window
![barthann.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/7fad78f1-63f2-23dd-08d9-08a177c035c0.png)
## [<u><font color="Blue">bohman</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.bohman.html) ：Bohman window
![bohman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/0a56a3e0-90f6-d144-c672-8b610fb72274.png)
## [<u><font color="Blue">boxcar</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.boxcar.html) ：boxcar or rectangular window
![boxcar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/9715f33e-959b-5d48-8f05-cf0a7f301981.png)
## [<u><font color="Blue">parzen</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.parzen.html) ：Parzen window
![parzen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/f4865954-18d5-49d5-38f8-6f70ff9daa89.png)
## [<u><font color="Blue">taylor</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.taylor.html) ：Taylor window
![taylor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/9e6044cd-4b49-cc5b-7bef-83f16b152334.png)
## [<u><font color="Blue">triang</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.triang.html) ：triangular window
![triang.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/36278f42-c666-257a-d208-a222288c01ae.png)
## [<u><font color="Blue">tukey</font></u>](https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.windows.tukey.html) ：Tukey window, also known as a tapered cosine window
![tukey.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275052/e43908cb-6e66-c703-7fac-cfbe25331f24.png)

[^1]: [<u><font color="Blue">株式会社 小野測器 - パワースペクトルとは何ですか？</font></u>](https://www.onosokki.co.jp/HP-WK/c_support/faq/fft_common/fft_spectrum_6.htm)

[^2]: [<u><font color="Blue">SPECTRAL AUDIO SIGNAL PROCESSING - Zero-Padding for Interpolating Spectral Displays</font></u>](https://ccrma.stanford.edu/~jos/sasp/Zero_Padding_Interpolating_Spectral_Displays.html)