我正在使用USB 供电的超声波麦克风制作 Raspberry Pi 蝙蝠探测器。我希望能够在排除昆虫和其他非蝙蝠噪音的同时记录蝙蝠。录音需要声音触发以避免过快填充 SD 卡并帮助分析。该网站解释了如何使用 SoX 执行此操作:
rec - c1 -r 192000 record.wav sinc 10k silence 1 0.1 1% trim 0 5
这会在至少 0.1 秒的触发声音后记录 5 秒,并包含一个 10kHz 高通滤波器。这是一个好的开始,但我真正想要的是一个高级过滤器,它可以排除蟋蟀和其他非蝙蝠噪音。昆虫和蝙蝠的叫声在频率上重叠,因此高通或带状滤波器不起作用。
Elekon Batlogger通过分析过零的周期触发器来执行此操作。从蝙蝠记录器网站:
蝙蝠(声带)和昆虫(颤音)的声音产生差异会影响周期的连续性。期间触发器利用了这一点:
当 ProdVal 和 DivVal 低于设置的限制时触发触发器,因此如果值在黄色范围内。(数值表示默认值):ProdVal = 8,数值越大触发越容易 DivVal = 20,数值越大越容易触发
图片中的翻译文本:
蝙蝠:音调信号
周期常数 => 过零 / 时间 = 稳定
昆虫:抓挠
周期常数 => 过零 / 时间 = 不同
MN => 每个测量间隔的周期数的平均值
SD => 周期数的标准差
较高的值即使在低频下也能更好地触发(还有昆虫!)反之亦然
有没有办法在 Raspberry Pi OS 中实现这个(或具有相同效果的东西)?我最熟悉的语言是 R。根据对这个问题的回答, R 似乎适合这个问题,尽管如果 R 不是最佳选择,那么我愿意接受其他建议。
我真的很感激一些用于录制音频和过滤的工作代码,如上所述。我想要的输出是包含蝙蝠呼叫的 5 秒文件,而不是昆虫或噪音。在 CPU / 电源使用方面需要高效,并且需要即时工作。
蝙蝠和昆虫的示例记录在这里。
更新:
我有一个在 Python 中工作的基本声音激活脚本(基于此答案),但我不确定如何在其中包含高级过滤器:
import pyaudio
import wave
from array import array
import time
FORMAT=pyaudio.paInt16
CHANNELS=1
RATE=44100
CHUNK=1024
RECORD_SECONDS=5
audio=pyaudio.PyAudio()
stream=audio.open(format=FORMAT,channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
nighttime=True # I will expand this later
while nighttime:
data=stream.read(CHUNK)
data_chunk=array('h',data)
vol=max(data_chunk)
if(vol>=3000):
print("recording triggered")
frames=[]
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("recording saved")
# write to file
words = ["RECORDING-", time.strftime("%Y%m%d-%H%M%S"), ".wav"]
FILE_NAME= "".join(words)
wavfile=wave.open(FILE_NAME,'wb')
wavfile.setnchannels(CHANNELS)
wavfile.setsampwidth(audio.get_sample_size(FORMAT))
wavfile.setframerate(RATE)
wavfile.writeframes(b''.join(frames))
wavfile.close()
# check if still nighttime
nighttime=True # I will expand this later
stream.stop_stream()
stream.close()
audio.terminate()