--- 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|...|