2014-10-29 102 views
3

我想生成正弦波並將其添加到字節數組。我搜索並找到了。但是,我總是會像附件一樣得到失真的波形。正弦波交替扭曲在Java

請給我你的意見爲什麼發生。謝謝。

我的代碼是在這裏

private byte[] getData(int freq) { // taking pitch data 
    double pha = Math.PI/2;   // defining phase 
    final int LENGTH = 44100 * 10; // defining length of sine wave, byte array 
    final byte[] arr = new byte[LENGTH]; 
    for(int i = 0; i < arr.length; i++) { 
     double angle = (2.0 * Math.PI * i*freq+pha)/(44100); 
     arr[i] = (byte) (Math.cos(angle) *127* 0.3); // 0.3 is amplitude scale   
    } 
    return arr; 
} 

Distort waveform example pic

enter image description here

+0

我這麼認爲,但我無法處理它。 – 2014-10-29 14:15:43

+0

@AkiSuihkonen,這是Java。沒有無符號類型。 – 2014-10-29 14:18:27

回答

5

的代碼看起來不錯。我懷疑它是可視化器將two's complement有符號值解釋爲無符號(-1變爲255-2變成254等等)。

寫到一個wav文件,並用SonicVisualiser

繪製它根據WAVE PCM soundfile format

8位採樣存儲爲無符號字節,範圍從0到255 16位採樣存儲爲2的補碼有符號整數,範圍從-32768到32767.

它看起來像你e它需要將正弦波向上移動128(以便它完全適合0-255範圍),或者移動到使用16位採樣。

+0

我寫入一個wav文件並用SonicVisualiser對其進行繪圖 – 2014-10-29 14:17:52

+0

字節是用Java簽名的。它是否在Sonic Visualizer中未簽名? – Arkadiy 2014-10-29 14:21:06

+0

@BilgeMiracAtici:查看最新的答案。 – NPE 2014-10-29 14:24:10

0

您可以使用此代碼來說服自己,你產生了什麼是Java語義水平適當:

public static void main(String[] args) { 
    for (byte b : getData(300)) System.out.println(sample(b)); 
} 

static String sample(byte val) { 
    final int len = (val-Byte.MIN_VALUE)/2; 
    final StringBuilder b = new StringBuilder(); 
    for (int i = 0; i < len; i++) b.append(i < len-1? ' ' : '#'); 
    return b.toString(); 
} 

它將打印一個很好的垂直正弦波。用這種方法生產的無符號字節修復代碼:

static byte[] getData(int freq) { 
    double pha = Math.PI/2; 
    final int LENGTH = 44100 * 10; 
    final byte[] arr = new byte[LENGTH]; 
    for(int i = 0; i < arr.length; i++) { 
    double angle = (2.0 * Math.PI * i*freq+pha)/(44100); 
    int unsignedSample = (int) (Math.cos(angle)*Byte.MAX_VALUE*0.3 - Byte.MIN_VALUE); 
    arr[i] = (byte) (unsignedSample & 0xFF); 
    } 
    return arr; 
} 

如果打印這一點,你會看到你在SonicVisualizer看到了同樣的波形,但該工具會顯得你意的方式。

+0

它看起來也適用於我,但我無法縮放幅度。我應該在哪裏添加* 0.3? – 2014-10-29 14:42:45

+0

它已經在聲明unsignedSample的代碼中。 – 2014-10-29 15:10:11

+0

是的,我明白了,但它不起作用。 – 2014-10-29 17:46:28