我有numpy.int16 (44100 2D )音频样本的2D阵列(共1376个)。每个示例都具有以下格式(示例值):
-4 4 -5 -10 -5 -6 -11 -4 -9 -7 -10 1 -4 -8 -9 -8 -4 -13 -14 -11 -12 -4 -14 -13 -9 -2 -2 -16 -5 -4 3 -5 -4 -8 -11 -10 -12 -16 -7 -8 -14 -14 -14 -16 -17 -8-13 -9 -6 -9 -9 -8 -12 -1 -4 -8 -2 -2 -8 -8 2 1 -8 32 0 -6 0 9 0 -2 0 -1 0 -3 -1 1 -2 -2 0 -6 -1 -2 -3 5 -3 1 -1 -5-3 0 -3 0 -3 -3 -2 -1 -2 1 -4 1 -6 -3 -2 -4 1 1 -1 -6 2 -1 -2 -5 -6 -5 -6 -2 -4 -1 0 -3 -6 -4 -5 -3
整个数组被称为sample_list (是的,非常令人惊讶)
我正在尝试对频域中的样本集执行带通滤波,然后将其转换回上面的时域格式。下面的代码完美地将样本从时域转换到频域,然后再转换回时域,尽管我仍然需要对其应用带通滤波器:
import numpy as np
for samp in sample_list:
time = np.linspace(0,1,44100) # currently not using
float_samp = np.float32(samp)
fft_spectrum = np.fft.rfft(float_samp)
freqs = np.fft.rfftfreq(len(fft_spectrum), d=time[1]-time[0]) # currently not using
### need bandpass filter here (brickwall is fine) - 5000Hz to 8000Hz
time_domain = np.fft.irfft(fft_spectrum)
converted = np.int16(time_domain) 过滤后,我计划通过Python frequency detection页面上的代码运行过滤后的样本,以找到音调的基本频率。频率检测代码目前在我的未过滤样本上工作得很好-尽管它会给我最响亮的音调的频率,而不一定是我正在寻找的音调的频率。因此我需要过滤。
砖墙过滤器是很好的,因为我正在寻找我的测试音调的时间和存在,而不一定是质量。我还担心如果不需要它们,会有额外的处理周期。
不幸的是,我不能使用Scipy和它的fft/过滤库,因为我在Android上运行代码,而Scipy不适用于我正在使用的代码平台(Kivy)。我必须严格使用Numpy库。
任何帮助/指导都是非常感谢的。
发布于 2015-05-01 16:25:13
如果一个砖墙过滤器是可以接受的,你可以直接使用,
bw_filter = np.zeros(freqs.shape, dtype='float32')
f_0 = 0.5*(8000 + 5000)
df_0 = 0.5*(8000-5000)
bw_filter[np.abs(freqs - f_0) < df_0] = 1.0
fft_spectrum *= bw_filter例如,我会更好地使用scipy.signal.butter,但由于您不能访问scipy,重新实现它可能需要时间。
https://stackoverflow.com/questions/29978764
复制相似问题