Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将多个不同频率的音调混合成一个_Python_Audio_Frequency_Pyaudio_Audio Processing - Fatal编程技术网

Python 如何将多个不同频率的音调混合成一个

Python 如何将多个不同频率的音调混合成一个,python,audio,frequency,pyaudio,audio-processing,Python,Audio,Frequency,Pyaudio,Audio Processing,我想使用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*tim

我想使用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的输出),没有声音

有没有其他方法混合多频音频


上,输出音调应如下所示,将混频器更改为浮点或简单添加音调:

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
变为float,而是简单地执行以下操作更容易、更快:

freq1 // 2 + freq2 // 2

当然,您只需要按元素添加两个数组。如果您可以运行此代码,您将在example.wav文件中发现没有声音输出,那么为什么会发生这种情况?我认为您使用的是
int
,它只是将每个值压缩为
0
?而不使用
int
音频播放器会显示一个损坏的文件您是否尝试过
freq1//2+频率2//2
?应该可以。音频播放器显示错误“此项的编码格式不受支持。”对我来说效果很好,请尝试在新的Python环境中更新
scipy
numpy
?或者使用不同的媒体播放器