2014-11-21 86 views
0

我今天看了波形,创建了一个小波发生器。我创建了一个正弦的声音是这样的:创建正弦音频信号时出现奇怪的小故障

public static Wave GetSine(double length, double hz) 
    { 
     int bitRate = 44100; 
     int l = (int)(bitRate * length); 
     double f = 1.0/bitRate; 
     Int16[] data = new Int16[l]; 
     for (int i = 0; i < l; i++) 
     { 
      data[i] = (Int16)(Math.Sin(hz * i * f * Math.PI * 2) * Int16.MaxValue); 
     } 
     return new Wave(false, Wave.MakeInt16WaveData(data)); 
    } 

MakeInt16WaveData看起来是这样的:

public static byte[] MakeInt16WaveData(Int16[] ints) 
    { 
     int s = sizeof(Int16); 
     byte[] buf = new byte[s * ints.Length]; 
     for(int i = 0; i < ints.Length; i++) 
     { 
      Buffer.BlockCopy(BitConverter.GetBytes(ints[i]), 0, buf, i * s, s); 
     } 
     return buf; 
    } 

可正常工作!现在,我想一举从一个频率到另一个像这样:

public static Wave GetSineSwoop(double length, double hzStart, double hzEnd) 
    { 
     int bitRate = 44100; 
     int l = (int)(bitRate * length); 
     double f = 1.0/bitRate; 
     Int16[] data = new Int16[l]; 
     double hz; 
     double hzDelta = hzEnd - hzStart; 
     for (int i = 0; i < l; i++) 
     { 
      hz = hzStart + ((double)i/l) * hzDelta * 0.5; // why *0.5 ? 
      data[i] = (Int16)(Math.Sin(hz * i * f * Math.PI * 2) * Int16.MaxValue); 
     } 
     return new Wave(false, Wave.MakeInt16WaveData(data)); 
    } 

现在,当我从200俯冲到100赫兹,播放的声音从200到0赫兹。出于某种原因,我不得不乘以0.5增量得到正确的输出。这可能是什么问题?这是一个音频事件还是在我的代码中有一个错误?

由于

编辑由TAW:我冒昧添加数据的屏幕截图,其示出了该问题的图表中,首先是与0.5因子,用1.0的第二和第三&第四与2.0和5.0:

enter image description here enter image description here enter image description here enter image description here

编辑:这里就是一个例子,从200到100赫兹俯冲: 调试值: Debug values 波显然并不在100Hz The resulting sine wave clearly does not end at 100 hz

+0

你是什么意思“时发出的声音,从200到0赫兹”?这是否意味着你通过循环观察了hz的值,并且在某个点它变成了零?另外,你用的是什么'长度'?将hzDelta乘以0.5会使hz从200变为150. – jaket 2014-11-21 22:01:24

+0

@pixartist:我没有解释,但也许插图可以帮助其他人看到问题..(如果您介意我的编辑,随意删除。 。!) – TaW 2014-11-21 22:23:14

+0

谢谢TaW。 @Jaket,不,值的行为如预期,它结束了hzEnd。播放的声音结束于hzStart + hzDelta * 2。我真的很困惑! – pixartist 2014-11-21 22:37:32

回答

0

最终挖掘出我糟糕的数学我想这可能是因为:

展望以L步骤从频率F1到F2你有

Fi = F1 + i * (F2 - F1)/L 

或频率

(F2 - F1)/L = S 

Fi = F1 + i * S 

我们发现有多远,我们进步了,我们需要的积分超过i,这将是

I(Fi) = i * F1 + 1/2 * i^2 * S 

这给或采取类似公式为sine内部术语。

请注意,您可以通过固定部分(S/2)圈外活动提高效率..