≡
导航
搜索
教程
插件
模型
模板
博客
交易
朋友
编程语言分享讨论总汇吧
已关注 | 取消
+关注
关注:
10
帖子:
1,222
签到
05月06日 尚未签到
看帖
图片
精品
视频
共有回帖数
0
个
一个关于线性变频正弦波的小陷阱
只看楼主
收藏
回复
心忧不前
等级:
我觉得这是个挺有意思的陷阱,于是简单写篇帖子骗骗分~
昨天SB给我发了段代码,他用C写了个程序想生成一段变频正弦波存成wav:频率从20Hz线性地变到10000Hz。但是程序写出来遇到了一个问题:使用频谱分析软件发现,频率最终变到了20000Hz左右。
https://github.com/m13253/sound-exp/blob/2cf918f8dfc7daedf1e18b1d588438a55fedc29f/sine-pitch/sine.c
这是原来的代码。
在sin前面加了行printf("%fn", freq);
然后
$ gcc sine.c
$ ./a.out log
发现freq的确是从20变到10000。
---
其实注意一下这行
buf = sin((2*M_PI*freq+1)*i/SAMPLE_RATE);
简化一下就是sin(2*pi*freq*t),我们很熟悉的freq频率的正弦波生成。但这里是不能这么用的。为什么呢?因为freq是在变的。
我们也可以把这理解成是在t轴上缩放函数sin(2*pi*t)的图像,把它挤扁freq倍。
但是如果变频的话,我们得边在t轴上跑边挤扁这个函数。注意直接更改freq,它是以y轴为中心挤扁图像的……于是就出现了不同步!
所以……我们要变在t轴上往右边跑,边以t为中心把sin(2*pi*t)的图像挤扁freq倍。
比较好实现的方法是,把2 * pi * freq * t抽出来,放到一个用来累加的变量里去。
每次循环把这个变量的值+=2 * pi * freq,
然后buf = sin(累加变量);
最终修改成这样:
https://github.com/m13253/sound-exp/blob/b74a121840c3f5cfdf4e8b14e1303eee17f2fb50/sine-pitch/sine.c
楼主 2015-10-23 13:56
回复
共有回帖数
0
个
回 帖
表情
图片
视频
欢迎来到本吧,您可以在此发帖和众多大咖交流学习.
选择或直接输入昵称
Tips:支持QQ截图直接粘贴
发表
登录直线网账号
自动登录
忘记密码
免费注册
本吧信息
查看详情
吧主:
禾木
本吧公告
好好学习,天天向上!
我常逛的吧
我管理的吧
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈
|
关于直线
|
版权声明
|
会员须知