2014-10-29 6 views
3

사인파를 생성하여 바이트 배열에 추가하려고합니다. 나는 수색하고 발견했다. 그러나 나는 항상 첨부 파일처럼 왜곡 된 파형을 얻습니다.자바에서 사인파가 왜곡을 반복합니다.

왜 그런지 생각해보세요. 감사.

내 코드는 여기

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

나는 그렇게 생각한다. 그러나 나는 그것을 다룰 수 없다. –

+0

@AkiSuihkonen, 이것은 자바입니다. 부호없는 유형은 없습니다. –

답변

5

코드가 잘 보이는 입니다. 나는 그것이 two's complement 서명 된 값을 255, -2이되고 -1이되고 254이되는 것으로 해석하는 시각화 자라고 생각합니다.

I는 WAV 파일에 기록하고 SonicVisualiser

로 플롯 WAVE PCM soundfile format에 따르면

샘플은 0 내지 255 (16)에 이르기까지, 부호 바이트로 저장되어, 8 비트 비트 샘플은 -32768에서 32767 범위의 2의 보수 부호있는 정수로 저장됩니다.

전자처럼 보입니다. ither는 사인파를 128만큼 (0-255 범위 내에서 완벽하게) 이동하거나 16 비트 샘플을 사용하도록 이동해야합니다.

+0

wav 파일에 쓰고 SonicVisualiser로 플롯 –

+0

바이트가 Java로 서명되었습니다. Sonic Visualizer에서 서명되지 않았습니까? – Arkadiy

+0

@BilgeMiracAtici : 업데이트 된 답변보기 – NPE

0

당신은 당신이 생성하는 자바 의미의 수준에서 적절하다고 자신을 설득하기 위해이 코드를 사용할 수 있습니다

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을 어디에 추가해야합니까? –

+0

이미 코드에서 unsignedSample을 선언 한 행에 있습니다. –

+0

예, 알지만 작동하지 않습니다. –