2011-11-26 4 views
2

저는 4 학년 프로젝트 (Functional Reactive Programming 다루기)를위한 작은 예제 응용 프로그램을 만들고 있습니다. 아이디어는 .wav 파일을 재생할 수있는 간단한 프로그램을 만든 다음 오디오 녹음 소프트웨어에서와 같이 재생중인 노래의 현재 볼륨을 '튀는'애니메이션을 보여줍니다. 필자는 스칼라에서 이것을 구현할 것이므로 주로 자바 라이브러리와 기존 솔루션을 살펴 보았습니다.주어진 시간에 .wav의 '볼륨'찾기

현재 저는 .wav 파일을 쉽게 재생할 수 있었지만 두 번째 목표를 달성하지 못했습니다. 기본적으로 .wav 파일을 디코드 할 수있는 방법이 있으므로 어딘가에 액세스 할 수 있습니다. '볼륨'을 지정된 시간에 액세스 할 수 있습니까? 볼륨으로 보면 나는 진폭을 의미한다고 생각하지만, 이것에 대해 틀릴 수도 있습니다 - 고등 물리학은 얼마 전이었습니다 ....

분명히, 나는 이것에 대해 많이 알지 못하기 때문에 누군가가 할 수 있다면 좋을 것입니다. 올바른 방향으로 나를 가리켜 라!

+0

RMS와 dB 등을 살펴보십시오. –

+0

[these] (http://stackoverflow.com/questions/5048852/using-jfreechart-to-display-recent-changes-in-a-time-series) 중 하나와 같은 것이 적절한보기를 만들 수 있습니다. – trashgod

답변

4

디지털 오디오 프로세싱에서 일반적으로 신호의 순간 피크 진폭을 참조하십시오 (PPM -- peak programme metering라고도 함). 당신이 원하는 방법을 정확하게에 따라 또는 일부 표준화 된 측정 모델 여부를하고자하는 경우, 당신도

  • 는 구현 샘플 프레임의 슬라이딩 윈도우 (창 당 최대 절대 값을 찾을 수)
  • 를 사용할 수 있습니다 주어진 지속 시간 동안 마지막 피크 값을 유지하고 초당 주어진 양의 데시벨만큼 '하락'값을 갖기 시작하는 일종의 피크 홀드 메커니즘.

다른 측정 모드는 일정 시간 창을 통해 통합하여 계산 RMS입니다 (창 길이 제곱 샘플 값, 분할을 추가하고, 제곱근을, 따라서 제곱 평균 RMS) . 이것은 신호의 '에너지'에 대한 더 나은 아이디어를 제공합니다. 피크 측정보다 부드럽게 움직이지만 최대 값은 포착하지 않습니다. 이 모드는 때때로 VU meter이라고도합니다. 일종의 지연 (저역 통과) 필터로이를 근사값으로 지정할 수 있습니다. 이 신호 강도의 우리의 인식과 더 나은 해당하고 대부분의 신호를 화면 공간을 더 정기적으로 범위를 생산으로 y[i] = y[i-1]*a + |x[i]|*(a-1), 일부 값 0 < a < 1

당신은 일반적으로 decibels에서 즉, 로그 함수의 값을 표시합니다.내가 함께 참여 해요

세 가지 프로젝트는 당신을 도울 수 있습니다 : 당신이 사용할 수있는

  • ScalaAudioFile가에 아직 젊고 불완전 프로젝트 인 AIFF 또는 WAVE 파일
  • ScalaAudioWidgets에서 샘플 프레임을 읽고 슬라이딩 윈도우를 사용하고 일정한 간격으로 윈도우의 현재 피크 값 (및 선택 사항 인 RMS)을 설정하면 뷰가 피크 홀드를 처리합니다. PPM 뷰를 포함하여 스칼라 스윙 위에 오디오 애플리케이션 위젯을 제공하십시오. 하강 시간
  • (ScalaCollider, clien t를 사용하여 사운드 파일을 재생하고 피크 및 RMS 진폭을 실시간으로 측정 할 수 있습니다. 후자는 아마 당신의 프로젝트를위한 과잉 공격 일 것이며 SuperCollider에 대해 들어 본 적이 없다면 심각한 학습 곡선이 필요할 것입니다. 장점은 음향 재생을 미터 디스플레이와 동기화하는 것에 대해 걱정할 필요가 없다는 것입니다.
+0

ScalaAudioFile이 너무 탁월하여 사용하기로 결정했습니다. wav의 초마다 크기를 얻는 방법에 관해 나와 함께 줄 수있는 도움이 있습니까? 현재이 작업을 수행하고 있습니다 (값 배열 만들기) : https://gist.github.com/1398345 – seadowg

5

wav 파일에서 스트림의 특정 지점에있는 데이터는 볼륨입니다 (동적 범위의 절반만큼 이동). 즉, 어떤 유형의 wav 파일 (예 : 8 비트, 모노)인지 알면 각 바이트는 단일 샘플을 나타냅니다. 샘플 속도 (44100 HZ)를 알고 있다면 시간에 44100을 곱하면 보려는 바이트입니다.

바이트의 값은 볼륨입니다 (0에서 255까지의 거리가 피크이고 127은 0 임). 이것은 인코딩이 뮤 법 인코딩이 아니라고 가정합니다. 당신은 샘플의 일부 고정 된 수의 창을 통해 비록 이러한 샘플을 평균 할 수 있습니다

http://www.gnu.org/software/octave/doc/interpreter/Audio-Processing.html

: 여기 이러한 형식 사이의 변환, 더 나은 아직 차이를 구별하거나하는 방법에 대한 몇 가지 좋은 정보를 발견했다.

+0

* "스트림의 주어진 지점에있는 데이터가 볼륨입니다."* 아니요. OP가 언급하는 볼륨의 종류가 아닙니다. E.G. 신호에서 127의 '평행선'값은 전체 볼륨이 아니지만 0 볼륨입니다. –

+0

예 .. 두 번째 단락에서 명확하게하려고했습니다. 명확하게 편집 할 것입니다. 이것은 mu-law 인코딩의 가능성을 설명하지 않기 때문에 이것은 단순한 것입니다. – snapfractalpop

+0

신장과 진폭이 섞여 있습니다. 사운드 파일의 프레임은 샘플링 된 연신율을 나타냅니다. 예를 들어, 사인파 'y [i] = sin (omega * i)'는 진폭이 일정 (1)하는 동안 -1과 1 사이에서 진동하는 연신율을가집니다. 볼륨별로 어떤 종류의 진폭 측정을 참조하십시오. –

관련 문제