문제

버퍼를 통해 각 반복 버퍼에서 오디오 볼륨을 줄이는 간단한 함수를 만들려고합니다.다음은 내 간단한 기능입니다.

double iterationSum = 1.0;

double iteration(double sample)
{
 iterationSum *= 0.9;

 //and then multiply that sum with the current sample.
 sample *= iterationSum;
 return sample;
}
.

이것은 44100 kHz 샘플레이션으로 설정하면 잘 작동하지만 문제가있는 문제는 88200 kHz로 변경된 예가 88200 kHz로 변경된 경우 샘플 레이트가 두 배나 두 배이므로 해당 시간 절반을 줄여야합니다.그렇지 않으면 그렇지 않으면 "페이드 아웃"을 하프 타임으로 끝낼 것입니다. 44100 / 88200= 0.5와 같은 요소를 사용하려고 노력했지만 이는 어떤 식 으로든 나아가는 단계를 반으로 만들지 않습니다.

이 간단한 문제로 멈추고 나를 인도 할 수있는 가이드가 필요합니다. 프로그램 시간 중에 샘플 레이트가 변경된 경우이 함수가 호출되면 각 반복의 반 단계를 수행 할 수 있습니까?

조사, morgan

도움이 되었습니까?

해결책

샘플 속도와 무관 한 가장 강력한 방법은 Fadeout이 시작된 이후로 시간을 추적하고 명시 적 Per fadeout(time) 기능을 사용하는 것입니다.

어떤 이유로 수행 할 수없는 경우 다음과 같이 샘플 속도를 기반으로 지수 부식률을 설정할 수 있습니다.

double decay_time = 0.01; // time to fall to ~37% of original amplitude
double sample_time = 1.0 / sampleRate;
double natural_decay_factor = exp(- sample_time / decay_time);
...
double iteration(double sample) {
    iterationSum *= natural_decay_factor;
    ...
}
.

~37%의 이유는 exp(x) = e^x, 여기서 e는 "자연 로그"기반이며 1/e ~ 0.3678...이기 때문입니다.당신이 당신의 부패 시간에 다른 붕괴 팩터를 원한다면, 당신은 그것을 일정하게 확장해야합니다 :

// for decay to 50% amplitude (~ -6dB) over the given decay_time:
double halflife_decay_factor = exp(- log(2) * sample_time / decay_time);

// for decay to 10% amplitude (-20dB) over the given decay_time:
double db20_decay_factor = exp(- log(10) * sample_time / decay_time);
.

다른 팁

Im 내가 이해했는지 모르겠지만, 이와 같은 것에 대해서는 어떨까요 :

public void fadeOut(double sampleRate)
{
    //run 1 iteration per sec?
    int defaultIterations=10;

    double decrement = calculateIteration(sampleRate, defaultIterations);

    for(int i=0; i < defaultIterations; i++)
    {

        //maybe run each one of these loops every x ms?
        sampleRate = processIteration(sampleRate, decrement);
    }
}


public double calculateIteration(double sampleRate, int numIterations)
{
    return sampleRate/numIterations;
}


private double processIteration(double sampleRate, double decrement)
{
    return sampleRate -= decrement;
}
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top