为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 319 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号