2013-10-13 3 views
0

다양한 속도로 읽을 수있는 오디오 스트림을 구현하는 클래스가 있습니다. 역방향 및 빠른 가변/"긁힘"을 포함하여 ... 읽은 부분에 선형 보간을 사용하면 모든 것이 매우 부드럽게 작동합니다.역방향 보간

하지만 지금은 다양한 속도로 스트림에 쓰기를 구현하고 싶습니다. 그리고 저에게 일종의 "역방향 보간"을 구현해야합니다. 즉, 입력 샘플 벡터 Z를 유추합니다. 벡터 Y로 보간하면 출력 X가 생성됩니다. 나는 쓰려고 노력하고있다.)

나는 일정한 속도로 할 수 있었지만 다양한 속도 (예 : 가속 또는 감속)에 대한 일반화는 더 복잡한 것으로 증명되었다.

이 문제가 반복적으로 해결되었다고 상상해 봅니다. 그러나 온라인에서 많은 단서를 찾을 수없는 것 같습니다. 따라서이 문제에 대해 들어 보았고 올바른 방향으로 나를 가리킬 수 있는지 구체적으로 질문합니다. , 나에게 해결책을 보여줘 :)

고마워!

+0

FIR을 사용하여 보간 작업을 수행하고 있습니까? – Michael

답변

0

나는 그것을 "역 보간법"이라고 부르지 않을 것입니다. 존재하지 않기 때문에 (내 생각은 당신이 외삽 법에 대해 이야기하고 있다고 생각했습니다!). 당신이하고있는 일은 단순히 고르지 않은 속도로 보간하는 것입니다.

보간 : 알려진 값 사이에 외삽 값을 찾는 : 일정한 속도로/보간 알려진 값

이상 값을 찾는 것은 "알려진 값 사이의 값을 찾아"의 일반 퀘스트보다 실제로 훨씬 더 간단합니다. 나는 2 가지 해결책을 제시한다.

1) 해결 한 다음 일반적인 문제를 가장 가까운 하나에 불과 하위 샘플 (추가 디더링 시도)

2) 상당히 높은 비율로 보간하고, 각 지점에 대해 당신이 이웃 N 포인트를 사용할 필요가 그것들에 N-1 다항식을 맞 춥니 다.

  • N = 2 선형 것와 상음 (C0 연속성)을 추가 할 수
  • N = 3 소스 샘플 사이의 중간 지점에서 단계 변화에 당신을 떠날 수 (N = 2 것보다 아마도 더 배음!)
  • N = 4는 C1 연속성을 얻습니다 (다음 샘플로 변경하면 기울기가 일치합니다). 확실히 애플리케이션에 충분합니다.

마지막으로 설명해 드리겠습니다.

각 출력 샘플에 대해 앞뒤 2 개의 입력 샘플을 사용하십시오. S0에서 S3까지를 단위 시간 규모 (나중에 샘플 기간을 곱함)라고 부르며, 시간 0에서 1까지 보간합니다. Y는 출력이고 Y '는 기울기입니다.

Y이 다항식과 차동 (기울기)로부터 계산한다

Y(t) = At^3 + Bt^2 + Ct + D 
    Y'(t) = 3At^2 + 2Bt + C 

다항식

확대 제 (양쪽 엔드 포인트에서의 값과 기울기) 제약

Y(0) = S1 
    Y'(0) = (S2-S0)/2 
    Y(1) = S2 
    Y'(1) = (S3-S1)/2 

Y(0) = D 
    Y'(0) = C 
    Y(1) = A+B+C+D 
    Y'(1) = 3A+2B+C 

샘플 끼우기

D = S1 
    C = (S2-S0)/2 
    A + B = S2 - C - D 
    3A+2B = (S3-S1)/2 - C 

마지막 2는 쉽게 풀 수있는 방정식 시스템입니다. 두 번째에서 첫 번째를 두 번 빼십시오. 당신이 A, B, C가 있고 당신이 당신의 알려진 샘플 사이의 샘플 값을 찾기 위해 다항식에 시간 't'에 넣을 수 있습니다 D되면

3A+2B - 2(A+B)= (S3-S1)/2 - C - 2(S2 - C - D) 
    A    = (S3-S1)/2 + C - 2(S2 - D) 

그런 다음 B는

B = S2 - A - C - D 

입니다.

다음 출력 샘플이 동일한 2 입력 샘플 사이에 있으면 출력 샘플마다 반복하여 A, B, C & D를 다시 사용하십시오. 매번 t를 계산하는 것은 Bresenham의 선 알고리즘과 비슷하지만 매번 다른 양만큼 진행됩니다.