共有回帖数 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

楼主 2016-04-09 15:03 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知