【发布时间】:2012-11-06 21:10:48
【问题描述】:
我在使用双精度时遇到精度损失,我似乎无法找到精度丢失的位置。 我正在编写一个软件合成器,由于某种原因,振荡器(声波发生器)的输入频率在某处出现严重混叠。 振荡器应该产生三角波形,并且正确的频率被传递给方法,但是当结果在扬声器中播放时,我可以清楚地听到声音捕捉到不同的频率。
我正在使用 NAudio (http://naudio.codeplex.com/),这个方法对我想要生成的每个样本运行一次。
代码如下:
double counter = 0;
int samplecounter = 0;
public double GetNextTriangle(double frequency)
{
double samplesperwave = (double)Parent.WaveFormat.SampleRate / frequency;
double length = (double)samplecounter / samplesperwave;
if (length.CompareTo(0.25) == -1)
{
counter = length * 4.0;
}
else if (length.CompareTo(0.75) == -1)
{
counter = 1.0 - (length - 0.25) * 4.0;
}
else
{
counter = -1.0 + (length - 0.75) * 4.0;
}
samplecounter++;
samplecounter = samplecounter > samplesperwave ? 0 : samplecounter;
return counter;
}
提前致谢! //垫子
【问题讨论】:
-
请使用
<和>运算符而不是CompareTo!! -
@Dai 这样代码可以很容易被人类理解。
-
@DOOMDUDEMX 无论如何,如果你必须使用 CompareTo,你应该使用
if (a.CompareTo(b) < 0)而不是if (a.CompareTo(b) == -1),因为如果接收者小于参数,该方法的协定允许它返回任何小于零的值. -
@DOOMDUDEMX 如果您无法通过阅读代码来调试它,那么您只需绘制输出并将其与您的预期进行比较。问题不在于精度。当然。问题是您没有正确编码方程式。
-
除了下面已经提供的几个优秀答案之外,值得考虑将 WaveTable 用于软件合成器。使用这种方法,您可以预先计算波形,然后对其进行索引(如果您需要支持更改频率或滑音,则可以在表中的条目之间进行插值)
标签: c# casting floating-point double naudio