Код

Для реализации проекта измерения звуковой частоты на Raspberry Pi с использованием задержки сигнала и работы с микрофонами, можно следовать следующим шагам. Мы будем использовать PyAudio для захвата звука, а также стандартные библиотеки Python для работы с задержкой.

Вот пример кода, который реализует ваше описание. Это базовый пример, который фиксирует время, когда сигнал достигает первого и второго микрофонов, и вычисляет задержку.

Пример кода для Raspberry Pi

import pyaudio
import numpy as np
import time

# Настройки
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
TIMEOUT = 5  # время ожидания в секундах

# Инициализация PyAudio
p = pyaudio.PyAudio()

# Открытие потока
stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)

def capture_sound():
    print("Начинаем захват звука...")
    data = stream.read(CHUNK)
    audio_data = np.frombuffer(data, dtype=np.int16)
    return audio_data

def detect_peak(audio_data):
    # Поиск пика сигнала
    peak_threshold = 500  # Порог для определения пика
    peaks = np.where(audio_data > peak_threshold)[0]
    if len(peaks) > 0:
        return peaks[0]  # Возвращает индекс первого пика
    return None

start_time_microphone1 = None
start_time_microphone2 = None

try:
    while True:
        # Захват звука от первого микрофона
        audio_data1 = capture_sound()
        peak1 = detect_peak(audio_data1)

        if peak1 is not None:
            start_time_microphone1 = time.time()  # Запоминаем время первого сигнала
            print("Сигнал обнаружен на микрофоне 1 в:", start_time_microphone1)

            # Теперь ждем сигнал от второго микрофона (в реальной системе это будет обработка другого потока, здесь можно симулировать)
            time.sleep(0.1)  # Симуляция времени, необходимого для открытия второго микрофона

            # Захват звука от второго микрофона
            audio_data2 = capture_sound()
            peak2 = detect_peak(audio_data2)

            if peak2 is not None:
                start_time_microphone2 = time.time()  # Запоминаем время второго сигнала
                print("Сигнал обнаружен на микрофоне 2 в:", start_time_microphone2)

                # Расчет задержки
                if start_time_microphone1 and start_time_microphone2:
                    delay = start_time_microphone2 - start_time_microphone1
                    print("Задержка между микрофонами:", delay, "секунд")
                    frequency = 1 / delay if delay > 0 else 0
                    print("Частота звука:", frequency, "Гц")

        time.sleep(0.5)  # Интервал между циклами

except KeyboardInterrupt:
    print("Остановка программы")

finally:
    # Закрытие потока
    stream.stop_stream()
    stream.close()
    p.terminate()

Описание работы кода:

  1. Настраивается захват аудиосигнала с использованием библиотеки PyAudio.
  2. Функция capture_sound() захватывает звук с микрофона и преобразует его в массив чисел.
  3. Функция detect_peak() ищет пики в звуковом сигнале.
  4. Главный цикл программы захватывает звук и фиксирует время, когда обнаруживаются пики на микрофонах.
  5. Задержка вычисляется как разница между двумя временными метками, когда были зарегистрированы пики, и на основе задержки вычисляется частота звука.

Примечания:

  • Данный пример кода требует установки библиотеки PyAudio. Установить её можно через pip: pip install pyaudio.
  • Этот код просто имитирует работу с двумя микрофонами; в реальной системе необходимо будет учитывать возможность использования двух отдельных потоков для захвата аудиоданных с различных источников.
  • Учтите, что использование реальные микрофоны может потребовать дополнительной настройки параметров захвата звука.

Комментарии

Популярные сообщения из этого блога

Распознавание речи без библиотек

Усилитель на микросхеме ILA7056. - Радиолюбитель - это просто