--- 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) 分析演算法只著重於高能量的區域。