创建Numpy FFT带通Fi

2024-04-20 04:55:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有二维数组数字输入16(44100Hz)音频采样(其中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-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-2-8-8 2 1-8 3 2 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 11-1-6 2-1-2-5-6-5-6-2-4-10-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)。我必须严格使用纽比图书馆。在

非常感谢任何帮助/指导。在


Tags: sample代码fft示例time格式np数组
1条回答
网友
1楼 · 发布于 2024-04-20 04:55:22

如果砖墙过滤器是可以接受的,你可以使用

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的权限,重新实现它可能需要时间。在

相关问题 更多 >