---
# System prepended metadata

title: 檢視長期時頻譜圖
tags: [soundscape viewer, ' tutorial', ' ecoacoustics', ' visualization']

---

---
title: 檢視長期時頻譜圖
description: Visualizing long-duration audio recordings
tags: soundscape viewer, tutorial, ecoacoustics, visualization
disqus: hackmd
---

# 檢視長期時頻譜圖

在跑完長期時頻譜圖 (LTS) 的分析後，總算可以來看看我們的資料長甚麼樣子了! 在這邊，我們要利用 Soundscape Viewer 中的 **lts_viewer** 來呈現 LTS。

請先確認要分析的資料夾位置，並將同一地點錄音時間無重疊的 mat 檔案放在資料夾中，並確認資料夾內沒有其他的 mat 檔案。Soundscape Viewer 會讀取所有的 mat 檔案 (但子資料夾中的檔案不會被讀取)，並把全部的 LTS 合併，依照時間順序重新排序。


```python=
# Import lts_viewer
from soundscape_IR.soundscape_viewer import lts_viewer

# Display the LTS
LTS=lts_viewer()

# Load mat files from the designated path
LTS.collect_folder(path)
LTS.plot_lts()
```
## 讀取 Drive 資料夾中的檔案
我們也可以運用 Soundscape Viewer 來讀取 Drive 資料夾上的 mat 檔案，只要指定 *folder_id* 即可。

```python=7
# Load mat files from the designated Drive folder
LTS.collect_Gdrive(folder_id='1dtkpfTivBRu_u8wA4nLSHfEsBIEvymiq')
LTS.plot_lts()
```

## 三種不同類型的 LTS
如果順利的話，應該會看到三個圖，從上到下分別呈現中位數、平均數、平均數-中位數的 LTS。一般來說，中位數可以呈現持續性的聲音訊號 (例如：風雨聲音、車聲、船隻噪音、動物合唱)，但該訊號在每筆聲音檔案內的出現機率必須大於50%才會被呈現。平均數則是會把全部的聲音能量都平均起來，不管是持續性的或是間歇性的訊號。平均數-中位數則是會呈現間歇性的聲音訊號。因此，針對不同的研究問題，可以選用不同類型的 LTS。

:::info
若是長時間錄音的中間有缺失，或有些時段是沒有錄音的話，Soundscape Viewer 會把這些缺失段落以空白資料補上。
:::

:::info
在 **collect_folder** 和 **collect_Gdrive** 兩個 function 中，也可以加入 time_sort=0，讓 Soundscape Viewer 不要依照時間順序整理 LTS。然而，這樣子作可能會導致 **plot.lts** 繪製出的圖片出現重大時序錯誤。
:::

## 觀察 LTS 中的細節

若只要觀察 LTS 中的一部分資料，或是調整圖片中的頻譜能量範圍，則必須先把指定的資料抽出，再透過 **matrix_operation.plot_lts** 繪製 LTS。

### lts_viewer.input_selection
* 選擇 LTS 類型 (*var_name*)：'median' | 'mean' | 'difference'
* 開始日期 (*begin_date*)、結束日期 (*end_date*)：請使用 'yyyymmdd' 或是 'yyyymmdd_HHMMSS' 的日期格式
* 頻率範圍 (*f_range*)：單位為Hz，請使用 [min, max] 的格式
* 預白化之百分位數 (*prewhiten_percent*)：單位為百分比 (整數)，詳細使用方法請見後面的說明
* 能量閾值 (*threshold*)：單位為 dB，詳細使用方法請見後面的說明

### matrix_operation.plot_lts
* 顯示頻譜能量之最小值 (*vmin*)、最大值 (*vmax*)：單位為 dB
* 顯示圖片之寬度 (*fig_width*)、高度 (*fig_height*)：大於0之數值

```python=+
# Import matrix_operation
from soundscape_IR.soundscape_viewer.utility import matrix_operation

# Select LTS and define parameters
input_data,f=LTS.input_selection(var_name='median', begin_date='20170601',...
             end_date='20170705', f_range=[], prewhiten_percent=0, threshold=0)

# Plot the selected LTS
a=matrix_operation()
a.plot_lts(input_data, f, vmin=0, vmax=80, fig_width=18, fig_height=6)
```

![new lts](https://lh3.googleusercontent.com/pw/ACtC-3eOi3zGahKUlZC0wX5XfElWQwzxcXjLNFXhZQEHO6norEO5IQ5nTr4pPtXbQ3niu9KZNKDvXz7IVznZjGLJfQiSKltaP-jkEiqxE1aKhCaZ7RyQ96TDAEb8UL9yL7IyhE7XpElfycDJtTmro8je0l0p=w976-h484-no?authuser=0)

## 預白化之百分位數 (*prewhiten_percent*)

有些聲音來自於錄音機周遭的環境事件、野生動物、人為活動，也有些聲音來自於背景，因而難以辨認來源。為了要協助研究人員觀察聲景的動態變化，必須要透過一些方法去除背景噪音。

Soundscape Viewer 透過量測聲音在 LTS 中各頻率下的機率分布，讓使用者可以自訂一個百分位數，並將聲音能量在這個百分位數以下都視為潛在的背景噪音。這個方法雖然可能會把一些能量較低的聲音視為背景噪音，但仍是一個非常快速並強化大部分聲音事件的方法。

首先，我們可以運用 **matrix_operation.spectral variation** 來觀察聲音在不同頻率的機率分布。使用 **matrix_operation.plot_psd** 的時候，也可以指定橫軸要以對數 (log) 或線性 (linear) 來呈現。

```python=
# Select LTS
input_data,f=LTS.input_selection('median')

# Plot the probability distributions for different frequencies
a=matrix_operation()
a.spectral_variation(input_data, f)
a.plot_psd(freq_scale='log')
```

![PSD](https://lh3.googleusercontent.com/pw/ACtC-3cUc1qPIAq7I3xQFI9bI-NyKJzz2BPgoBt42XskRgDFgLInDHkgbbsHK1ssTwZeuf8GRajm7t6d-INyrw4sRDPQSutCnAlVu1avHKQY6_-anc0aFzoxowBlq7j6mZRnZSQPDzFkZWcb803spxgbD1e1=w382-h375-no?authuser=0)

從上圖來看，聲音能量在第 20 百分位數以下的變動範圍很小。因此，我們可以試著指定 *prewhiten_percent* 為第 20 百分位數，來觀察看看 LTS 經過預白化之後的變化。

預白化的過程中，首先會計算 LTS 在指定百分位數的能量大小，得到各頻率的閾值，再將各頻率下所有的資料點減去對應的閾值。經過預白化的處理之後，LTS 裡面的數值會從聲音的能量大小，轉變為相對於背景噪音的訊雜比 (Signal-to-noise ratio)，在後續進行聲源分離 (Source separation) 的時候會非常有用。

```python=+
# Select LTS and define parameters
input_data,f=LTS.input_selection(var_name='median', begin_date='20170601',...
             end_date='20170705', f_range=[], prewhiten_percent=20, threshold=0)

# Plot the selected LTS
a.plot_lts(input_data, f, vmin=0, vmax=80, fig_width=18, fig_height=6)
```

![lts after prewhitening](https://lh3.googleusercontent.com/pw/ACtC-3cg2kzBHeJEakRTPa9dQdgvUe4EwrrRun_lgneHknoRHJqT94UKOIDYrZAcU-8f3gcvsSe8w8Y2cB1-3oUh3ZEpLZUMI6-FBE50gzWUkthXJenl6f6NmnEtOvCdq0762tsBGoTzcIsQ3-SGpZzDw8hR=w976-h484-no?authuser=0)

## 能量閾值 (*threshold*)

預白化的過程中，也能夠再搭配能量閾值，把低於閾值的部分強制設為指定的閾值。舉例來說，預設的能量閾值為 0，若經過預白化後，有些資料點為負值，則其頻譜能量會被強制改為 0。

這個程序對於後續進行聲源分離 (Source separation) 是必要的，因為 Soundscape Viewer 目前採用的非負矩陣分解法 (Non-negative matrix factorization) 不能分析具有負值的資料。此外，適當提高能量閾值，也可以去除掉細微的雜訊，並強制群聚 (Clustering) 分析演算法只著重於高能量的區域。