---
title: 製作長期時頻譜圖
description: Making a long-term spectrogram
tags: soundscape viewer, tutorial, ecoacoustics, audio processing
disqus: hackmd
---
# 製作長期時頻譜圖
為了解聲景的長時間變化趨勢,許多聲景生態學的研究人員透過長期時頻譜圖 (Long-term spectrogram) 提升資料分析的效率。在 Soundscape Viewer 中,我們會運用 **lts_maker** 來進行長期時頻譜分析。
LTS 是一種基於傳統時頻譜圖而衍生的技術,透過統計方法 (例如:平均值、中位數) 把短時間內的時頻譜資料 (時間解析度通常為數毫秒至數十毫秒) 壓縮為單一的功率頻譜後,再把大量聲音檔案的功率頻譜合併起來。
LTS 的時間解析度可依據研究目的或錄音資料大小而定,通常會設為數十秒或數分鐘,以在有限的記憶體容量下呈現出數月或數年的頻譜變化。此外,和傳統的時頻譜分析一樣,LTS 也必須要決定頻率的解析度。
> $\Delta F = \dfrac{N_{sf}}{N_{fft}}$
> $N_{sf}$ 為錄音資料的取樣頻率 (Sampling frequency)
> $N_{fft}$ 為快速傅立葉變換 (Fast Fourier transform) 的視窗長度 (Window length)
## 確認錄音設定與頻譜分析參數
在進行 LTS 分析之前,必須要先確定幾項錄音設定與頻譜分析參數。
* 錄音感度 (*sensitivity*):單位為 dB re 1V/µPa,若沒有感度資料,則輸入0以取得頻譜能量的相對變化。
* 錄音聲道 (*channel*):第一聲道為左聲道,第二聲道則為右聲道。
* 錄音環境 (*environment*): 空氣 (*'air'*) 或水下 (*'wat'*)。
* 快速傅立葉變換視窗長度 (*FFT_size*):資料點數 (整數,一般為2的N次方)。
* 快速傅立葉變換視窗之間的重疊度 (*window_overlap*):介於 $\ge$ 0 和 $\lt$ 1 之間的值。
* 每筆錄音資料省略的開頭片段 (*initial_skip*):單位為秒。
* LTS 的時間解析度 (*time_resolution*):單位為秒。
若希望 LTS 的時間解析度等同於每筆錄音資料的長度,則不需要指定 *time_resolution* 或指定 *time_resolution = None* 即可。以下面的範例來說,若指定 *time_resolution = 60*,代表每筆錄音檔案會被先切為60秒的片段,在將各片段轉換為一筆功率頻譜,因此 LTS 上每筆頻譜資料之間的時間差就會變成60秒。
```python=
# Import the Soundscape Viewer
from soundscape_IR.soundscape_viewer import lts_maker
# Define recording and analysis parameters
LTS_run=lts_maker(sensitivity=0, channel=1, environment='wat', FFT_size=1024,...
window_overlap=0, initial_skip=0, resolution=60)
```
## 指定分析資料夾
輸入錄音設定和頻譜分析的參數後,即可指定分析的資料夾位置 (*path*)。
```python=+
LTS_run.collect_folder(path=r"D:\Data")
```
:::info
須注意 Soundscape Viewer 不會分析子資料夾中的內容,只會分析該資料夾中的WAV檔案。
:::
## 可以分析Google Drive上的錄音資料嗎?
若錄音資料位於Google Drive上,Soundscape Viewer 也可以直接連結 Drive 資料夾,取用雲端上的錄音資料。若要分析 Drive 上的資料,則必須取得 Drive 資料夾編碼 (*folder_id*)。
Drive 資料夾編碼為最後一個斜線 (/) 後面的一連串英數字,以下面的 Drive 資料夾為例:
> https://drive.google.com/drive/u/0/folders/1_ZQzFFN6tJmcDS7McOdPZUhnuZVBP8Ub
```python=7
LTS_run.collect_Gdrive(folder_id='1_ZQzFFN6tJmcDS7McOdPZUhnuZVBP8Ub' )
```
:::info
透過 Soundscape Viewer 取用 Drive 上的資料時,請依照 Google 的要求授權,並貼上驗證碼後才能連接到 Drive 資料夾。
:::
## 確認檔名上的時間標籤格式
如同[準備聲音資料](/Eyc9BJ-BT6e5KrFBa3Nknw)一節中說明的,在分析前必須先確認檔名上的時間標籤格式 (*dateformat*)、時間標籤之前的文字 (*initial*)。若檔名上的時間標籤只有 *yy*,而沒有完整的 *yyyy*,則必須加上不足的年份 (*year_initial*)。
```python=+
# Example 1: Test_20180101_120000.wav (年份為2018,不需追加)
LTS_run.filename_check(dateformat='yyyymmdd_HHMMSS',initial='Test_',...
year_initial=0)
```
```python=8
# Example 2: 180101120000.wav (年份為18,需加上2000)
LTS_run.filename_check(dateformat='yymmddHHMMSS',initial=[],year_initial=2000)
```
## 確認儲存的檔案名稱
輸入要儲存的檔案名稱 (*save_filename*),注意必須包含副檔名 .mat。一般情況下,產生的 mat 檔案會儲存於目前的工作目錄,但也可以透過 Soundscape Viewer 連結到指定的 Drive 資料夾,將 mat 檔案上傳到 Drive 上 (需指定 *folder_id*)。
```python=11
LTS_run.run(save_filename='test.mat',folder_id=[])
```
## 儲存的檔案裏面有甚麼?
儲存的 mat 檔案,可以透過 Soundscape Viewer 進行後續的分析。此外,在 Python 下可以透過 **SciPy**,在 R 的環境下可以用 **R.matlab**,除了 Python 和 R 之外,也可以用 MATLAB 直接讀取分析的資料。
資料結構如下:
* Result.LTS_median (以中位數壓縮的長期時頻譜圖)
* Result.LTS_mean (以平均數壓縮的長期時頻譜圖)
* Result.f (頻率)
* Result.link (檔案名稱與連結)
* Parameters.FFT_size (FFT視窗長度)
* Parameters.overlap (視窗重疊比例)
* Parameters.sen (錄音感度)
* Parameters.sf (取樣頻率)
* Parameters.channel (分析聲道)
Result.LTS_median 和 Result.LTS_mean 的資料中,第一欄為錄音開始時間,後續欄位為對應頻率 (Result.f) 的頻譜強度。
| Column 0 (Time, MATLAB format) | Column 1 (Result.f[0]) | Column 2 (Result.f[1]) | ... |
| ------------------------------ | ---------------------- | ---------------------- | --- |
| 737060| 80.5|79.1|...|
| 737061| 80.3|79.5|...|