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