如何创建一个带有自定义频率音调/波形的.wav文件?

4

我有一个关于波形发生器的问题。我正在尝试创建一个包含给定频率声音的.wav文件。我所使用的代码如下:

$freqOfTone = 21000;
$sampleRate = 44100;
$samplesCount = 80000;

$amplitude = 0.25 * 32768;
$w = 2 * pi() * $freqOfTone / $sampleRate;

for ($n = 0; $n < $samplesCount; $n++)
{
    $data->samples[1][] = 32768 + (int)($amplitude *  sin($n * $w));
}

很遗憾,输出波形不正确,我得到了几个频率而不是一个: http://i49.tinypic.com/ab1nx0.png 应该是这个样子的: http://i50.tinypic.com/33zbslk.png 我在哪里出了问题?:(

1
你的代码看起来很不错。你有没有考虑过问题可能出在写入数据或数据格式上?比如有符号和无符号、位深度等。 - Brad
可能是由于samplesCount不是波周期的倍数而引起的别名问题 - 尝试调整该参数。 - moonwave99
@moonwave99 我把 $samplesCount 改成了 88200。但是它并没有解决问题。输出文件看起来还是一样的... 我认为样本数不应该对波的频率产生任何影响。 - Sirtarius
@moonwave:88200个样本是两个完整周期。 - Ignacio Vazquez-Abrams
@IgnacioVazquez-Abrams 我知道,但问题提供了80k作为值 - 我只是在解释窗口如何影响频谱;并不是说我声称这是问题的答案,只是试图提供一个提示作为评论 ;) - moonwave99
显示剩余3条评论
2个回答

1

考虑到采样率,所需频率与Nyquist frequency太接近,无法正确采样。我建议您使用96kHz的采样率。


嗯...我想保留我的44.1kHz。有没有办法计算出最近可用的音调频率? - Sirtarius
2
为了获得任何形式的适当分辨率,您应该每个周期至少有4个样本,这将使您达到11.025kHz。这可能看起来很低,但请记住,44.1kHz的带宽是为记录音乐而选择的,而不是为高频实验而选择的。 - Ignacio Vazquez-Abrams

0

我终于取得了一些成果,但我的解决方案与我原来想的有点不同... 无论如何,我拿了样本并将它们通过高通频率滤波器。 信号有点失真,但对于我的目的仍然足够好:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接