#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) звука нет.
Есть ли какой-либо другой способ смешивания звука с несколькими частотами?
Выходной тон должен быть таким на спектрограмме
Комментарии:
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? Или используйте другой медиаплеер