주어진 데시벨 값으로 WAV 파일을 감쇠시키는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1149092

  •  18-09-2019
  •  | 
  •  

문제

WAV 파일의 진폭을 25%줄이고 싶다면 다음과 같은 글을 쓸 것입니다.

for (int i = 0; i < data.Length; i++)
{
    data[i] *= 0.75;
}

그러나 오디오 기술에 대해 읽은 많은 기사는 데시벨 측면에서 진폭에 대해 논의합니다. 나는 원칙적으로 데시벨 유닛의 로그 특성을 이해하지만 실제 코드 측면에서는 그리 많지 않습니다.

내 질문은 : 20 데시벨로 WAV 파일의 볼륨을 감쇠시키고 싶다면 위의 예와 같이 코드에서 어떻게이를 수행 할 것인가?

업데이트: 주어진 수의 데시벨에 의해 감쇠하기위한 공식 (NILS Pipenbrinck의 답변에 기초 함) (예 : 10, 20 등) :

public void AttenuateAudio(float[] data, int decibels)
{
    float gain = (float)Math.Pow(10, (double)-decibels / 20.0);
    for (int i = 0; i < data.Length; i++)
    {
        data[i] *= gain;
    }
}

그래서, 내가 감쇠하고 싶다면 20 데시벨, 게인 계수입니다 .1.

도움이 되었습니까?

해결책

데시벨에서 얻기 위해 전환하고 싶다고 생각합니다.

오디오 방정식은 다음과 같습니다.

얻는 데시벨 :

  gain = 10 ^ (attenuation in db / 20)

또는 C :

  gain = powf(10, attenuation / 20.0f);

게인에서 DB로 변환 할 방정식은 다음과 같습니다.

  attenuation_in_db = 20 * log10 (gain)

다른 팁

당신이 오디오를 집착하고 싶다면, 나는 좋은 결과를 얻었습니다. 정상화하십시오 패키지 nongnu.org. 수행 방식을 연구하려면 소스 코드를 자유롭게 사용할 수 있습니다. 나도 사용했습니다 wavnorm, 현재 홈페이지가 현재 나오는 것 같습니다.

고려해야 할 사항 : .Wav 파일에는 다양한 형식이 있습니다. 위의 코드는 wave_format_float에서만 작동합니다. PCM 파일을 다루는 경우 샘플은 8, 16, 24 또는 32 비트 정수가됩니다 (8 비트 PCM은 0..255의 부호없는 정수를 사용하고 24 비트 PCM을 포장하거나 포장 풀 수 있습니다 (packed == 3 바이트 값은 서로 옆에 포장되어 4 바이트 패키지에서 포장되지 않은 == 3 바이트 값).

그리고 대체 인코딩 문제가 있습니다. 예를 들어 Win7에서는 모든 Windows 사운드는 실제로 WAV 컨테이너의 MP3 파일입니다.

불행히도 소리만큼 간단하지 않습니다 :(.

죄송합니다. 질문을 오해했습니다… DB에서 Float로 변환하는 파이썬 구현 (위의 진폭의 승수로 사용할 수 있음)을 볼 수 있습니다.

https://github.com/jiaaro/pydub/blob/master/pydub/utils.py

간단히 말해서 그것은 다음과 같습니다.

10 ^ (db_gain / 10)

따라서 볼륨을 6 dB로 줄이려면 각 샘플의 진폭에 다음과 같이 곱합니다.

10 ^ (-6 / 10)  ==  10 ^ (-0.6)  ==  0.2512
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top