亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python librosa.core.stft() 和 matlab spectrogram(x)

python librosa.core.stft() 和 matlab spectrogram(x)

江戶川亂折騰 2021-12-26 10:25:32
我正在將 Python 代碼轉換為 MATLAB。Python 代碼,使用以下命令:stft_ch = librosa.core.stft(audio_input[:, ch_cnt], n_fft=self._nfft,                              hop_length=self._hop_len, win_length=self._win_len,                              window='hann')其中audio_input.shape=(2880000, 4), self._nfft=2048,self._hop_len=960和self._win_len=1920。轉換為 MATLAB 時,我使用了:stft_ch = spectrogram(audio_input(:, ch_cnt), hann(win_len), win_len-hop_len, nfft);在那里我核實size(audio_input)=2880000, 4,win_len=1920,win_len-hop_len=960和nfft=2048。我從 MATLAB 得到一個輸出,size(stft_ch)=1025, 2999其中 Python 顯示stft_ch.shape=(1025, 3001)。2999MATLAB 輸出中的大小很清楚,并且在if window 是向量的文檔中表現出色k = ?(Nx – noverlap)/(length(window) – noverlap)?。但是,我在Python 文檔中找不到tset的長度。為什么尺寸之間存在差異?我的轉換好嗎?是否有一個 Python 函數可以產生更類似于 MATLAB 的spectrogram()輸出,以便我可以獲得相同大小的復數輸出?
查看完整描述

1 回答

?
萬千封印

TA貢獻1891條經驗 獲得超3個贊

很長一段時間后,并沒有得到滿意的賞金,我自己找到了答案。

MATLAB 函數spectrogram()輸出一個時間向量,該向量對應于每個窗口的中間,同時省略最后一個窗口。例如,具有 3 個樣本窗口和 1 個樣本重疊的 10 個樣本長度的信號將產生以下 4 個窗口:

1:33:55:77:9, 其中m:n表示一個窗口,包括從mn包括第nth 個樣本的樣本。

因此,窗戶的中心將是:2,4,6,8。請注意,不包括第 10 個樣本。

似乎 MATLAB 需要number_of_windows(number_of_windows-1)*hop_length+window_size<=number_of_samples.

另一方面,在 python 版本liberosa.core.stft()上,t 是每個幀的第一個樣本的時間,幀覆蓋的比輸入信號多。例如,具有 3 個樣本窗口和 2 個樣本跳(跳和不重疊)的 10 個樣本長度的信號將產生以下 4 個窗口:

1:3, , 3:55:77:99:11, 其中m:n表示一個窗口,包括從mn包括第nth 個樣本的樣本。

因此,窗口的開頭將是:1,3,5,7,9。請注意,包括第 11 個不存在的樣本。

似乎 liberosa 需要最小number_of_windows化到number_of_windows*hop_length>number_of_samples.

就我而言:

(2999-1)*960+1920=2880000<=2880000 對于 MATLAB。3001*960=2880960>2880000 而 30000*960=2880000 !> 2880000 在 python 中。

請注意,時間可以通過設置center=True標志以 python 為中心。

這是我能找到的最好的解釋。歡迎任何其他解釋作為答案。


查看完整回答
反對 回復 2021-12-26
  • 1 回答
  • 0 關注
  • 311 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號