샘플 레이트 변경 사이에 오디오의 기능을 사라냅니다
-
21-12-2019 - |
문제
버퍼를 통해 각 반복 버퍼에서 오디오 볼륨을 줄이는 간단한 함수를 만들려고합니다.다음은 내 간단한 기능입니다.
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;
}
. 제휴하지 않습니다 StackOverflow