2016-08-26 2 views
0

일부 사운드 프로세싱이 필요한 프로젝트를 진행 중입니다. 사운드를 녹음하고 신호를 플로트로 변환하여 처리하는 방법을 알고 있습니다. 문제는 최종 처리 사운드를 재생하기 위해 해당 숫자를 바이트로 변환하는 방법을 모르겠다는 것입니다.어레이에서 사운드 신호를 생성하려면 어떻게합니까?

이와 같은 배열 상상 :

[-954.04373976038096, -289.02199657142637, 603.07726299005469, 558.24833180011706, -252.49007227640698, -884.07367717525278, -754.89044791362232] 

을 그리고 사운드 재생이 비슷한으로 변환 위해 필요 : 나는 각 숫자를 변환하면

[b'\x92\xffQ\xffO\xff\xad\xff\x12\x00\xfc\xfff\xff\xe4\xfe\xee\xfeC\xffA'] 

을 바이트는 bytes()을 사용하고 재생합니다. 단지 잡음이 들립니다. 무슨 일이 일어나고 있는지를 알기 위해 다시 float로 변환 할 때 원래 플로트와 다른 값을 갖습니다.

+0

이것은 거의 의미가 없습니다. 7 샘플은 0.1ms 상당의 오디오와 같습니다. –

+0

정수를 바이트로 변환하는 방법을 묻는 중 ...? – Harrison

+0

아니요, 아닙니다. 나는 그것을하는 법을 압니다. 그러나 바이트 배열을 연주 할 때, 나는 소리를 듣지 않고, 소리를 듣지 않습니다. 그것이 저를 미치게합니다. – luc4stroll

답변

0

먼저 값의 최대 범위를 알아야합니다. 귀하의 가치를 감안할 때, -2000.0에서 2000.0 일지 모르겠지만 생각이 없습니다. 그래서 내 추측은 잘못되었을 가능성이 큽니다. 일반적으로 부동 소수점 오디오 신호의 숫자는 -1.0에서 1.0까지입니다. 분명히, 당신은 훨씬 더 큰 가치를 가지고 있습니다. 이유가 있다면 괜찮습니다. 그렇지 않은 경우 신호 범위를 -1.0에서 1.0으로 조정해야합니다. 많은 응용 프로그램과 라이브러리는이 규칙을 사용합니다.

그런 다음 올바른 대상 형식을 알아야합니다. 귀하의 질문에서 그것을 알 수있는 방법이 없습니다. 예를 들어, 대상 형식은 "little endian"바이트 순서로 16 비트 정수로 부호가있을 수 있습니다.

값을 변환하려면 먼저 모든 입력 값을 가능한 최대 (절대) 값으로 나눠야합니다. 데이터 범위가 -1.0에서 1.0 인 경우이 작업을 수행하지 않습니다. 그런 다음이 값에 대상 형식의 최대 수를 곱하십시오. 대상 형식이 16 비트 정수인 경우 2**15 또는 32768입니다. 사실 최대 부호있는 16 비트 정수는 (0도 저장해야하므로) 32767이므로 1을 적게 차지하므로 오버플로를 방지하려면이 값을 사용해야합니다. 결과 값은 이미 정확하지만 여전히 부동 소수점 값입니다. 그래서 그들을 int로 변환해야합니다. 마지막으로 정수 값을 bytes으로 변환 할 수 있습니다. struct 모듈을 사용합니다. 올바른 format string을 지정해야합니다. 예 : 리틀 엔디안 부호있는 16 비트 숫자의 경우 '<h'

그런 말을 모두 들었지만, 필요한 전환을 수행하는 사운드 I/O 라이브러리를 사용하는 것이 훨씬 쉽습니다. sounddevice 모듈 부동 소수점 값을 -1.0에서 1.0 범위로 확장해야하지만 나머지는 자동으로 수행 할 수 있습니다. NumPy 배열을 사용하는 경우 훨씬 간단하지만 일반 Python 버퍼에서도 작동합니다.

관련 문제