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:
编辑:这里就是一个例子,从200到100赫兹俯冲: 调试值: 波显然并不在100Hz
你是什么意思“时发出的声音,从200到0赫兹”?这是否意味着你通过循环观察了hz的值,并且在某个点它变成了零?另外,你用的是什么'长度'?将hzDelta乘以0.5会使hz从200变为150. – jaket 2014-11-21 22:01:24
@pixartist:我没有解释,但也许插图可以帮助其他人看到问题..(如果您介意我的编辑,随意删除。 。!) – TaW 2014-11-21 22:23:14
谢谢TaW。 @Jaket,不,值的行为如预期,它结束了hzEnd。播放的声音结束于hzStart + hzDelta * 2。我真的很困惑! – pixartist 2014-11-21 22:37:32