如何从阵列麦克风的每个麦克风中获取声音峰值

时间:2019-01-25 08:14:51

标签: pyaudio

我应该制造一种可以定位大声噪声源的设备。我已经知道其背后的数学原理,但是在编写代码时遇到了问题。我得到了一个16通道的阵列麦克风(UMA-16 miniDSP),我想从麦克风中抽出每100微秒读取阵列中每个麦克风的音量,因此我可以使用麦克风之间的时间差来获得角度。 那么,如何使麦克风发出声音呢? 我现在拥有的代码可以告诉我有关音量的一些常规信息,但并不能保证每个麦克风的安全性。 非常感谢。

我发现我的解决方案不起作用,因为当我只给一个麦克风倾斜时,我存储的所有soudleves都跟我所指向的麦克风一样高。

import csv
import pyaudio
import time
import numpy as np


 # method for reading the mics and writing the csv-file
def reading_mics_write_csv():
    CHUNK = 64
    RATE = 44100
    amount_mics = 16

    p = pyaudio.PyAudio()
    stream = p.open(format=pyaudio.paInt16, channels=amount_mics, rate=RATE, input=True, frames_per_buffer=amount_mics * CHUNK)

    print("recording started")
    data_list = []

    for i in range(int(5 * (RATE / CHUNK))):    #go for 5 seconds

        data = np.frombuffer(stream.read(CHUNK, exception_on_overflow=False), dtype=np.int16)

        peak = 16 * [0]
        peak_time = time.perf_counter()

        for j in range(amount_mics): #I thought this would do the job, but it doesn't
            start_data = CHUNK * j
            end_data = (CHUNK * (j + 1)) - 1
            peak[j] = np.average(np.abs(data[start_data:end_data])) #eg data[0:63]

        data_list.append([i, peak_time, peak[0], peak[1], peak[2], peak[3],
                      peak[4], peak[5], peak[6], peak[7], peak[8],
                      peak[9], peak[10], peak[11], peak[12], peak[13],
                      peak[14], peak[15]])


    print("recording finished")

    with open('datafile.csv', mode='a') as csv_file:
        csv_writer = csv.writer(csv_file, delimiter=';')
        for i in range(len(data_list)):
            csv_writer.writerow(data_list[i])

#main

reading_mics_write_csv()

我很想了解麦克风的信息如何存储在数据中。 在接下来的工作中,我将尝试以dB(A)来获得声级,如果有人知道如何做到这一点,那也很好,尽管这不是我的主要问题。

0 个答案:

没有答案