Как объединить несколько разных частотных тонов в один

#python #audio #frequency #pyaudio #audio-processing

#python #Аудио #частота #pyaudio #обработка звука

Вопрос:

Я хочу создать звуковой тон, который состоит из нескольких частотных аудио в диапазоне от 2 кГц до 3 кГц, используя python.

Я создал эти функции для генерации звука, состоящего из 2 тонов разной частоты

 import numpy as np
from scipy.io.wavfile import write


def generate_hightone():
    samplerate = 44100; fs = 2000
    time = 0.5
    t = np.linspace(0., time, round(samplerate*time))
    amplitude = np.iinfo(np.int16).max
    data = amplitude * np.sin(2. * np.pi * fs * t)
    data = np.int16(data/np.max(np.abs(data)) * 32767)
    return data


def generate_lowtone():
    samplerate = 44100; fs = 2200
    time = 0.5
    t = np.linspace(0., time, round(samplerate*time))
    amplitude = np.iinfo(np.int16).max
    print(amplitude)
    data = amplitude * np.sin(2. * np.pi * fs * t)
    data = np.int16(data/np.max(np.abs(data)) * 32767)
    return data


def freq_mixer(freq1,freq2):
    print(len(freq1),len(freq2))
    return np.round(freq1*0.5).astype(int)   np.round(freq2*0.5).astype(int)


data = freq_mixer(generate_hightone(),generate_lowtone())

write("example.wav", samplerate, data)
 

Из этого аудио сохраняется, но когда я проигрываю этот звук, не воспроизводится ни один тон. Когда я сохраняю только один тон, он воспроизводит звук, но в случае микширования (вывод freq_mixer) звука нет.

Есть ли какой-либо другой способ смешивания звука с несколькими частотами?

Выходной тон должен быть таким на спектрограммеhttps://auditoryneuroscience.com/acoustics/spectrogram

Комментарии:

1. Конечно, вам просто нужно добавить два массива поэлементно.

2. Если вы можете запустить этот код, вы не найдете вывода звука в примере. wav-файл, почему это происходит тогда?

3. Я думаю, вы используете int which просто сворачивает каждое значение в 0 ?

4. без использования int аудиоплеера отображается поврежденный файл

5. Вы пробовали только freq1 // 2 freq2 // 2 что? Это должно сработать.

Ответ №1:

Аудиоданные должны содержать int16 значения, потому что это 16-битный звук.

Исходные тоны преобразуются в int16 here:

 data = np.int16(data/np.max(np.abs(data)) * 32767)
 

С другой стороны, микшер создает int (который совпадает с int64 ), а не int16 , здесь:

 np.round(freq1*0.5).astype(int)   np.round(freq2*0.5).astype(int)
 

Преобразование его в int16 , вероятно, сработало бы, но на самом деле проще и быстрее никогда не переходить с int16 плавающего на плавающий, а просто делать это вместо этого:

 freq1 // 2   freq2 // 2
 

Ответ №2:

Измените частотный микшер на float или выполните простое добавление тонов:

 def freq_mixer(freq1,freq2):
    print(len(freq1),len(freq2))
    return np.round(freq1*0.5).astype(float)   np.round(freq2*0.5).astype(float)


data1 = generate_hightone()
data2 = generate_lowtone()
data3 = data1 data2 #simpler addition
data3 = freq_mixer(generate_hightone(),generate_lowtone())
samplerate = 80000
write("example.wav", samplerate, data3)
 

Комментарии:

1. аудиоплеер показывает ошибку «Этот элемент был закодирован в формате, который не поддерживается».

2. у меня все работает нормально, попробуйте обновить scipy и numpy в новой среде Python? Или используйте другой медиаплеер