数码之家

 找回密码
 立即注册
搜索
查看: 2049|回复: 10

[STM] 我也来玩玩任意波形生成

[复制链接]
发表于 2020-4-30 09:43:29 | 显示全部楼层 |阅读模式
平台:STM32F103+ES9023。
生成方式:受频率调制的整数谐波累加器。

波形1(关闭FM,12次谐波初始相位固定为0,幅度1/ω,ω=1,2,……,12):

波形2(关闭FM,12次谐波初始相位固定为180,幅度1/ω,ω=1,2,……,12):



这是为什么呢?根据傅里叶变换,


对于f(x)=t*(u(t+1)-u(t-1))的信号,其变换结果为:
F(ω)=j*(e^-j*ω - e^jω) / ω =sinωt / ω
可以看到,谐波中只存在sinωt这种分量,是奇函数的叠加,最终得到的波形也是奇函数。这是对于一个锯齿波的傅里叶变换结果,但是波形不可能只有一个,如果将其进行周期延拓,得到无限的锯齿波输出,则傅里叶变换应由下式求得:

这里ak是傅里叶变换F(ω)在ω=k的取值,带入上式就可以求得最终结果了,可自行推导。从连续波形的傅里叶变换可以看出,信号频率成分不再连续而是变成信号频率本身的整数倍的分量叠加,幅度也改变了。具体原理可参看相关书籍。
傅里叶变换是可逆的,也就是说通过傅里叶变换可以将任意波形分解成一系列正弦波组合,而通过一些列正弦波按分解结果叠加也可以还原原始波形。但是对于任何条件而言,都不可能做到无限的频带和绝对的精度,所以最终合成的结果与原始波形或者目标波形总是有所差异的。
上述波形采用了12次谐波叠加,相位固定且幅度变化为1/ω,符合展开结果,最终得到了非常贴近的输出结果。如果继续累加高次谐波则输出波形会越来越接近理想结果。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 3家元 +55 收起 理由
kkdkj + 20 当天打不了分,改天来打
cushion + 20 謝謝分享
人艰不拆了 + 15

查看全部打赏

发表于 2020-4-30 09:50:58 | 显示全部楼层
哈哈,这个我也玩了,我只会正弦波变方波的变换:cool:
回复 支持 反对

使用道具 举报

发表于 2020-4-30 09:52:34 | 显示全部楼层
人艰不拆了 发表于 2020-4-30 09:50
哈哈,这个我也玩了,我只会正弦波变方波的变换


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-30 09:56:07 | 显示全部楼层
在锯齿波的基础上做魔改,如果保持第一次实验的各谐波幅度相位关系不变,人为的将1与2次,2与3次,以此类推总共操作6次,两两为一个组合对调幅度,那么最终的波形就是这样:

如果在第二次的基础上,人为的削弱高频成分,只保留最高到6次谐波,则波形是这样:


相比于12次谐波的叠加来看,波形特征几乎不变,但是平滑了很多,可以想到锯齿波的边沿跳变是无数次谐波上升的叠加,或者说缺少高频分量就不能使得信号快速跳变,反过来快速跳变的信号具有很高的带宽。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-30 10:12:36 | 显示全部楼层
本帖最后由 la45088d1 于 2020-4-30 10:23 编辑

这是一个正弦波,平淡无奇,听感单一纯净:

这是一个正弦波,但是它的频率是时变的,其频率受到比它频率高5倍的信号调制,调制系数m=0.43=a/ω2,表达式为f(t)=sin(ω1*t+a*sinω2*t):

可以看出加入FM后,且载波信号与基带信号数量级差的不多或者一致的时候,基带信号将无法保证原来的形状变得乱七八糟的,但是呢这样的波形听感并不糟糕,相反是清脆的铃铛声。这是该波形的频谱图:

可以看到,成功的用了2个不同频率的波形生成了十几个不同的频率成分,而一般的加性合成不能产生新的频率成分,12个频率的叠加仍然是12个频率。一个基带信号
ωm调制载波信号,则调制后的信号具有的频率成分为ω=ωc+n*ωm,n=0,±1,±2,……
所以FM合成可以通过简单的几个振荡器产生特征及其复杂的声音信号,这是从以前用到现在的声音合成技术

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-30 10:36:05 | 显示全部楼层
所以我在原来的加性合成的基础上加入了基波频率调制,所以可以产生更复杂更真实的音效。
这是一个普通的谐波累加波形:

对其基波使用的FM以后,生成极多的新成分:


这是我这几天的结果:
音效1:死亡水缸
录音文件:
频谱图:

音效2:合成钢琴
录音文件:


频谱图:

音效3:什么鬼笛
录音文件:


频谱图:

音效4:破铃铛
录音文件:


频谱图:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +20 收起 理由
有点不烧 + 20 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2020-4-30 11:25:00 来自手机浏览器 | 显示全部楼层
这个研究好高端。:praise:
回复 支持 反对

使用道具 举报

发表于 2020-4-30 15:58:08 | 显示全部楼层
la45088d1 发表于 2020-4-30 10:12
这是一个正弦波,平淡无奇,听感单一纯净:

这是一个正弦波,但是它的频率是时变的,其频率受到比它频率高 ...

哈哈,这个我得试试,但是我的机器速度太慢,算这个乘法够呛啊:redheart:
回复 支持 反对

使用道具 举报

发表于 2020-4-30 23:03:13 来自手机浏览器 | 显示全部楼层
本帖最后由 sadate 于 2020-5-1 10:42 编辑

@la45088d1 怎么用简易一点的方法,模拟出类似立式空调开关机时那种清脆的和弦铃音呢?全用单片机软件方法模拟波形,对性能要求很高,能否软硬结合,用性能差一点的单片机也能近似模拟一些有特色的声音呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-1 21:49:36 | 显示全部楼层
sadate 发表于 2020-4-30 23:03
@la45088d1 怎么用简易一点的方法,模拟出类似立式空调开关机时那种清脆的和弦铃音呢?全用单片机软件方法 ...

你想做什么才是关键的。如果是做产品有简单暴力的方法。
      1,比如你下载一个声音合成器引擎,先在PC机上捏出一个想要的音色,再导出波形数据,把波形数据以查找表的方式存放到MCU的Flash中需要的时候读出来就行。这个方法是假设你只想做个简单的操作提示音。
      2,又比如,你可以使用两个外部的正弦波压控振荡器,一个的压控输入端直接连接到MCU的DAC脚,其输出端经过一个模拟乘法器输出到另一个的压控输入端,另一个压控振荡器的输出端经过模拟乘法器变成最终输出。调制时MCU通过DAC控制调制振荡器的频率,通过模拟乘法器的另一个输入引脚控制调制系数。输出幅度由输出的模拟乘法器另一端电平控制。这样对于MCU来说既不需要预先保存正弦波表,又不需要实时计算正弦值,只需要在合适的时候通过两个DAC输出引脚设置调制频率和调制系数,随后通过第三路DAC的电平变化缓慢改变输出幅度即可。这个适合你玩。
      3,终极解决方案:外挂一块SPI Flash,很便宜容量又大,可以随便存储任何的音调采样,或者一首完整的音乐。
你要做什么完全不明朗所以只能给你大概的建议。你要知道做产品和业余瞎搞完全不同,只是发出提示声和播放音乐又是大相径庭。
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-5-1 22:19:41 | 显示全部楼层
这是最新的效果视频:https://www.bilibili.com/video/BV1F54y1R7mw/
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-20 20:21 , Processed in 0.109200 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表