2014-11-21 44 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)圈外活動提高效率..