Как определить частоту и продолжительность звуковых сигналов в файлах WAV?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как определить частоту и продолжительность звуковых сигналов в файлах WAV?

Сообщение Anonymous »

У меня есть некий файл test.wav, и мне нужно получить из этого файла частоты звуков и их длину. Чтобы протестировать свое решение, я создал звук test.wav со следующими «звуковыми сигналами»:
1500 Гц в течение 100 мс, 1900 Гц в течение 300 мс, 1200 Гц в течение 10 мс. и 1900 Гц в течение 300 мс
И я ожидал, что мое решение будет печатать «звуковые сигналы», указывающие частоту и длину. Но мое решение игнорировало короткие звуковые сигналы в течение 10 мс (и после некоторого эксперимента я обнаружил, что мои решения игнорируют все звуковые сигналы короче на 100 мс (и это также увеличивает некоторые частоты)
Мой нерабочий решение:

Код: Выделить всё

import numpy as np
from scipy.io import wavfile

def extract_frequencies_and_durations(wav_path, frame_duration=0.02, freq_tolerance=5):
rate, audio_data = wavfile.read(wav_path)
if audio_data.ndim > 1:
audio_data = np.mean(audio_data, axis=1)
frame_length = int(rate * frame_duration)
frequencies = []
durations = []
current_freq = None
current_duration = 0
for i in range(0, len(audio_data), frame_length):
frame = audio_data[i:i + frame_length]
fft_spectrum = np.fft.fft(frame)
freqs = np.fft.fftfreq(len(fft_spectrum), 1 / rate)
magnitude = np.abs(fft_spectrum)
dominant_freq = abs(freqs[np.argmax(magnitude)])
if current_freq is None or abs(dominant_freq - current_freq) > freq_tolerance:
if current_freq is not None:
frequencies.append(current_freq)
durations.append(current_duration)
current_freq = dominant_freq
current_duration = frame_duration
else:
current_duration += frame_duration
if current_freq is not None:
frequencies.append(current_freq)
durations.append(current_duration)

return frequencies, durations

# output
wav_path = 'test.wav'
frequencies, durations = extract_frequencies_and_durations(wav_path)
for freq, dur in zip(frequencies, durations):
print(f"{freq:.2f}Hz - {dur * 1000:.2f}ms")

Как я могу исправить это решение или какое другое решение существует?


Подробнее здесь: https://stackoverflow.com/questions/791 ... -wav-files
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как определить частоту и продолжительность звуковых сигналов в файлах WAV?
    Anonymous » » в форуме Python
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Как определить частоту и продолжительность звуковых сигналов в файлах WAV?
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Есть ли эффективный способ назначить звуки (tick.wav, end_break.wav, end_task.wav)?
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Есть ли эффективный способ назначить звуки (tick.wav, end_break.wav, end_task.wav)?
    Anonymous » » в форуме Python
    0 Ответы
    40 Просмотры
    Последнее сообщение Anonymous
  • Есть ли эффективный способ назначить звуки (tick.wav, end_break.wav, end_task.wav)?
    Anonymous » » в форуме Python
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»