大家有没有听过音叉发出的声音?音叉振动产生的声波很接近正弦波。计算机合成的纯正正弦波,点击下面的音频即可试听。下面是频率为 100 HZ 的音频。

记得给公众号加个星标,不会错过精彩内容。

怎么说呢,和我们平时听到的乐器声完全不一样。这是因为,正弦波只包含一种频率,而我们平时听到的乐器的声波里掺杂着各式各样的频率。其中,我们把声波中强度最高的频率称为基本频率,把基本频率的倍数频率成为泛音。而基本频率与泛音的配合,使得乐器的音色如此优美。

正弦波的声音

path 参数为音频文件保存地址,freq 为正弦波的频率。rate 为正弦波的采样率,即每秒钟采样点的个数,duration 为正弦波持续时间。np.linspace 在 0 到 duration 范围内产生 samples 个采样点,vals 求得每个点的幅值。接着我们将幅值扩大 (2 ** 15 - 1) 倍,使得结果在 - 32767 ~ 32767 之间。即使用十六位二进制保存数据值,之后将数据转换为字节串,方便写入文件。

def write_sine(path:str, freq:float, rate:int=44100, duration:int=5):samples = rate * durationx = np.linspace(0, duration, samples)vals = np.sin(2 * np.pi * freq * x)data = np.array(vals * (2 ** 15 - 1), 'int16').tostring()write_wave(path, data)

高斯白噪声

高斯白噪声直接使用 np.random.randn 函数即可。

def white_noise(length:int):return np.random.randn(length)

工作原理

建立环形缓冲区,充当两端固定的弦。

设缓冲区的新产生尾部元素为 y,缓冲区长度为 p,则 y = 0.5 * [y(t-p) + y(t-p-1)]  * alpha。y(t-p) 显然是缓冲区的第一个元素,由于缓冲区是环形的,y(t-p-1) 实际上是缓冲区最后一个元素。我们在缓冲区尾部添加这个元素,并删除缓冲区第一个元素,从而保证环形缓冲区长度不变。求平均值,相当于均值滤波,使得声波更加平滑,相当于低通滤波器,从而去除高次谐波,保留基波分量。最后,使用衰减因子而模拟振动的能量损失。

  • 创建环形缓冲区,长度N = S /  f,S 为采样频率,f 为基本频率。

  • 向环形缓冲区填充高斯白噪声,作为初始值。

  • 从环形缓冲区取出第一个元素,放入样本区。

  • 将第一个元素与环形缓冲区的最后一个元素相加,并求得平均值,将得到的结果乘以衰减系数 alpha。

  • 将得到的计算结果存入环形缓冲区尾部。

  • 删除环形缓冲区的第一个值。

def generate_wave(freq:float, rate:int=44100, sample_rate:int=44100, duration:float=1,alpha=0.996):length = int(sample_rate / freq)buf = deque(white_noise(length))points = int(sample_rate * duration) samples = np.zeros(points, 'float32')for i in range(points):samples[i] = buf[0]avg = alpha * 0.5 * (buf.popleft() + buf[-1])buf.append(avg)samples = np.array(samples * Aconst.amplitude.value, 'int16')return samples, samples.tostring()

保存音频

最后我们使用 wave 来保存音频数据。setparams 接受5 个参数,分别为声道数、样本宽度、样本采样率、样本帧数,‘NONE’ 和 ‘uncompressed’ 表明音频是非压缩的。

def write_wave(path:str, data:bytes, frame_rate:int=44100, frames:int=44100):with wave.open(path, 'wb') as w:w.setparams((Aconst.channels.value, \Aconst.sample_width.value, \frame_rate, \frames, \'NONE', 'uncompressed'))w.writeframes(data)

下面是 五声音阶中 C4 音符的合成音频。

播放音频

可以使用标准库中的 winsound 的 PlaySound 函数,来播放 wav 音频。

还可以参考我之前的文章。Python 播放音频与录音

最后,根据 karplus 算法生成了下面这些频率的合集。

{"A0": 27.5, "A#0": 29.14, "B0": 30.87, "C1": 32.7, "C#1": 34.65, "D1": 36.71, … , "C8": 4186.01}

历史文章推荐阅读:

Python 标准库学习 --- string

通过例子学递归

精选历史文章合集!

用 Python 加密文件

以上就是 Python 合成音符的全部内容,还请大家多多转发支持。如需获取源代码,后台回复2019519

Karplus-Strong 算法合成音符相关推荐

  1. 【Win 10 应用开发】MIDI 音乐合成——音符消息篇

    在上一篇中,老周介绍了一些乐理知识,有了那些常识后,进行 MIDI 编程就简单得多了.尽管微软已经把 API 封装好,用起来也很简单,但是,如果你没有相应的音乐知识基础,你是无法进行 MIDI 编程的 ...

  2. 用算法合成新药:一场新式卡斯帕罗夫与深蓝的巅峰对决

    本文来自AI新媒体量子位(QbitAI) 一分子就是一世界. 对药物研发人员来说,确实这样.在这篇<Nature>的文章中,渥太华记者Asher Mullard将把你拉进一个药香世界. 故 ...

  3. Karplus-Strong 算法生成音符

    大家有没有听过音叉发出的声音?音叉振动产生的声波很接近正弦波.而计算机合成的纯正正弦波,点击下面的音频即可试听. 音频地址 怎么说呢,和我们平时听到的乐器声完全不一样.这是因为,正弦波只包含一种频率, ...

  4. python黑洞_史上第一张黑洞照片是用Python合成的?

    这两天,史上第一张黑洞照片,在朋友圈和各大公众号疯传,希望你没有收到视觉中国的律师函. 好了,言归正传. 这个照片是怎么「拍到」的呢? 其中一位研究人员(一个妹子,MIT 的博士,就是头图这位)就在  ...

  5. 【FFT/IDFT】高效算法

    题目: 设x(n)是长度为2N的有限长实序列,X(k)为x(n)的2N点 DFT. (1)试设计用一次N点FFT完成计算X(k)的高效算法; (2)若已知 X(k),试设计用一次N点 IFFT实现求X ...

  6. 海思平台的拍照和拍照后期处理算法的介绍

    参考:https://download.csdn.net/download/who_you_are/9806928 拍照方案 拍照的场景中,一般的视频预览和抓拍的分辨率是不一样的,而且拍照的ISP的效 ...

  7. js数据过滤算法搭建

    需求描述 公司需要搭建一个paas平台兼容所有的硬件,硬件把自己采集到的数据发送到paas平台,paas平台把数据处理之发送到各个服务.很多时候硬件发送的数据量特别大,很多不是我们需要的,这个时候,我 ...

  8. 史上第一张黑洞照片是用Python合成的?

    作者 | 不正经IO 来源 | 不正经程序员(ID:VeroniqueVeronique) 这两天,史上第一张黑洞照片,在朋友圈和各大公众号疯传,希望你没有收到视觉中国的律师函. 好了,言归正传. 这 ...

  9. Cheaptrick算法

    Cheaptrick,a spectral envelope estimator for high-qualityspeech synthesis 转载请注明出处! 2015年Morise发表在SPE ...

最新文章

  1. 如何通俗解释欧拉公式?
  2. Android 模仿微信启动动画
  3. 山东春季高考计算机可以报考的本科学校,山东春季高考专业有哪些?可以报考的本科院校吗?...
  4. Python3 简明教程
  5. hdu-1104-Remainder(BFS打印路径+数论)(%与mod的区别)
  6. php 访问 sharepoint列表,SharePoint—用REST方式访问列表
  7. AWS ECS简单了解
  8. OpenStack Cinder发展动态系列--Austin峰会
  9. angularjs双向绑定_AngularJS隔离范围双向绑定示例
  10. 在Java中,final修饰的类有什么特点
  11. Daemon Process
  12. android通讯录字母特效,Flutter 城市/通讯录列表字母索引联动效果实现
  13. HTML5+CSS3 为图书简介页面添加图像及视频
  14. linux雨滴桌面,Rainmeter(雨滴桌面秀)
  15. USYD悉尼大学DATA 2002 【R语言学习1】【介绍R】Introduction to R「虽迟但到」
  16. APP全栈工程师修炼之路(三)
  17. Android AlertDialog 对话框开启和关闭输入法问题
  18. 家事:庆祝父亲60岁生日
  19. 2021直播电商下半场,“网易严选们”为何成主播良港?
  20. epic如何修改着色器缓存路径

热门文章

  1. 老是失眠,晚上入睡困难,睡意慢慢全无,头脑越来越清醒
  2. Vue中实现放大镜效果
  3. JS 计算两个时间的间隔
  4. 第十二章 卷积神经网络实战--猫狗识别
  5. 设计模式之:解剖观察者模式【z】
  6. WebBrowser插件使用分享
  7. rabbitmq 手动提交_RabbitMQ系列(四)RabbitMQ事务和Confirm发送方消息确认——深入解读 - 王磊的博客 - 博客园...
  8. HTMLCSS——利用CSS定位背景图片 background-position
  9. 绝对值得收藏的,关于癌症的文章
  10. 【LeNet-5】手写数字识别MNIST