This commit is contained in:
CroneKorkN 2025-06-01 18:41:15 +02:00
parent 98588ab2a0
commit da4d78aa8f
Signed by: cronekorkn
SSH key fingerprint: SHA256:v0410ZKfuO1QHdgKBsdQNF64xmTxOF8osF1LIqwTcVw

18
process
View file

@ -44,27 +44,22 @@ def process_recording(filename):
for block in soundfile.blocks(path, blocksize=samples_per_block, overlap=overlapping_samples): for block in soundfile.blocks(path, blocksize=samples_per_block, overlap=overlapping_samples):
sample_num += samples_per_block - overlapping_samples sample_num += samples_per_block - overlapping_samples
# get block date and calculate FFT # calculate FFT
block_date = recording_date + datetime.timedelta(seconds=sample_num / samplerate)
labels = rfftfreq(len(block), d=1/samplerate) labels = rfftfreq(len(block), d=1/samplerate)
complex_amplitudes = rfft(block) complex_amplitudes = rfft(block)
amplitudes = np.abs(complex_amplitudes) amplitudes = np.abs(complex_amplitudes)
# get amplitudes only between 100 and 1000 Hz # get the frequency with the highest amplitude within the search range
search_amplitudes = amplitudes[(labels >= DETECT_FREQUENCY_FROM/ADJACENCY_FACTOR) & (labels <= DETECT_FREQUENCY_TO*ADJACENCY_FACTOR)] search_amplitudes = amplitudes[(labels >= DETECT_FREQUENCY_FROM/ADJACENCY_FACTOR) & (labels <= DETECT_FREQUENCY_TO*ADJACENCY_FACTOR)]
search_labels = labels[(labels >= DETECT_FREQUENCY_FROM/ADJACENCY_FACTOR) & (labels <= DETECT_FREQUENCY_TO*ADJACENCY_FACTOR)] search_labels = labels[(labels >= DETECT_FREQUENCY_FROM/ADJACENCY_FACTOR) & (labels <= DETECT_FREQUENCY_TO*ADJACENCY_FACTOR)]
# get the frequency with the highest amplitude
max_amplitude = max(search_amplitudes) max_amplitude = max(search_amplitudes)
max_amplitude_index = np.argmax(search_amplitudes) max_amplitude_index = np.argmax(search_amplitudes)
max_freq = search_labels[max_amplitude_index] max_freq = search_labels[max_amplitude_index]
max_freq_detected = DETECT_FREQUENCY_FROM <= max_freq <= DETECT_FREQUENCY_TO
# get the average amplitude of the search frequencies # calculate signal quality
adjacent_amplitudes = amplitudes[(labels < DETECT_FREQUENCY_FROM) | (labels > DETECT_FREQUENCY_TO)] adjacent_amplitudes = amplitudes[(labels < DETECT_FREQUENCY_FROM) | (labels > DETECT_FREQUENCY_TO)]
signal_quality = max_amplitude/np.mean(adjacent_amplitudes) signal_quality = max_amplitude/np.mean(adjacent_amplitudes)
# check for detection criteria
max_freq_detected = DETECT_FREQUENCY_FROM <= max_freq <= DETECT_FREQUENCY_TO
good_signal_quality = signal_quality > MIN_SIGNAL_QUALITY good_signal_quality = signal_quality > MIN_SIGNAL_QUALITY
# conclude detection # conclude detection
@ -72,6 +67,8 @@ def process_recording(filename):
max_freq_detected and max_freq_detected and
good_signal_quality good_signal_quality
): ):
block_date = recording_date + datetime.timedelta(seconds=sample_num / samplerate)
# detecting an event # detecting an event
if not current_event: if not current_event:
current_event = { current_event = {
@ -117,7 +114,10 @@ def main():
for filename in sorted(os.listdir(RECORDINGS_DIR)): for filename in sorted(os.listdir(RECORDINGS_DIR)):
if filename.endswith(".flac"): if filename.endswith(".flac"):
try:
process_recording(filename) process_recording(filename)
except Exception as e:
print(f"Error processing {filename}: {e}")
if __name__ == "__main__": if __name__ == "__main__":