赞
踩
最近在做语音信号处理相关的项目,在Xilinx PYNQ Z2上实现SRP-PHAT算法,一起做的同学提供了算法的matlab版本,因为PYNQ是基于python的Jupyter Lab开发,所以要将SRP-PHAT用python重写,在转换时遇到了很多细节问题,花了不少时间,在此记录下来,方便大家参考。
复现期间这个官方手册给予了我不小帮助:NumPy for MATLAB users — NumPy v1.21 Manual
例如:
- data1,fs = read_wav_file("mic1.wav") # data1是音频数据,fs是该音频的采样频率
- print(data1.shape)
-
- >> (190208,)
这里data1并不是1行190208列的行向量,也不是190208行1列的列向量,对其转置一下,输出不变
- data1,fs = read_wav_file("mic1.wav") # data1是音频数据,fs是该音频的采样频率
- data1 = data1.T
- print(data1.shape)
-
- >> (190208,)
如果要获得1行190208列的data1,就要进行一次reshape了:
- data1,fs = read_wav_file("mic1.wav") # data1是音频数据,fs是该音频的采样频率
- data1 = data1.reshape(1,-1)
- print(data1.shape)
-
- >> (1,190208)
例如:
- window_len = 256
- fft_bin = window_len / 2 + 1
- window_len = 256
- fft_bin = window_len // 2 + 1
matlab中的hanning窗使用:
window = hanning(window_len);
这是所生成hanning窗的头部数据:
python中,numpy也有对应的hanning函数,不过生成的窗和matlab略有不同:
window = np.hanning(window_len)
hanning窗头部数据:
可见,第一行多了0,相应的尾部也多一个0:
解决办法是生成窗时多用两个点,同时去掉首位的0:
window = np.hanning(window_len+2)[1:-1]
这样就可以了!
matlab进行FFT的方式和python是有区别的,
matlab中进行FFT: x_fft = fft(x1);
在python中用numpy实现FFT需要加上axis参数,即:
x_fft = np.fft.fft(x1,axis=0)
这样二者就一致了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。