如何将多个不同频率的音调混合为一个
How to mix multiple different frequency tones into one
我想使用 python 创建一个由 2kHz-3kHz 范围内的多个频率音频组成的音频音调。
我创建了这些函数来生成由 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 的输出)没有声音。
还有其他混合多频音频的方法吗?
上的输出音应该是这样的
将混频器更改为 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)
音频数据应包含 int16
个值,因为它是 16 位音频。
这里原音调转为int16
:
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
我想使用 python 创建一个由 2kHz-3kHz 范围内的多个频率音频组成的音频音调。
我创建了这些函数来生成由 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 的输出)没有声音。
还有其他混合多频音频的方法吗?
上的输出音应该是这样的将混频器更改为 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)
音频数据应包含 int16
个值,因为它是 16 位音频。
这里原音调转为int16
:
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