2013-10-13 94 views
0

我有落實,可以以不同的速度讀取的音頻流的類(包括反向和快速變化/「刮」)......我用線性內插的讀取部分和一切工作很體面..反向插補

但現在我想要實現在不同速度和寫入流,並要求我實施了一種「反向插補」即推斷,與向量Y插入時會產生輸出X輸入樣本向量Z(我試圖寫)..

我已經設法做到恆定速度,但一般爲不同的速度(例如加速或減速)被證明更加複雜..

我想這個問題已經解決了多次,但我似乎無法在網上找到許多線索,所以我的具體問題是,如果任何人聽說過這一問題,並可以點我在正確的方向(或者甚至更好,給我一個解決方案:)

謝謝!

+0

你通過使用FIR做你插值? – Michael

回答

0

,我不會把它稱爲「反向插補」爲不存在(我首先想到的是你在談論推!)。你所做的只是插值,只是速度不均勻。

插值:已知值之間找到一個值 推斷:尋找超越已知值

值從恆定速率插值到/比「發現已知值之間的值」的通用任務確實要簡單得多了。我提出2個解決方案。

1)插值到顯著率較高,然後只子樣品到最近的一個(嘗試添加抖動)

2)解決通用的問題:每一個點,你需要使用相鄰的N個點併爲它們擬合一個N-1階多項式。

  • N = 2是線性的,並會添加色彩(C0連續性)
  • N = 3可以用階梯變化讓你在你的源樣本之間的中間點(比N = 2的泛音可能更糟!)
  • N = 4會使您獲得C1連續性(當您更改爲下一個樣本時,斜率將匹配),對於您的應用程序來說肯定足夠了。

讓我解釋一下最後一個。

對於每個輸出樣本使用2前和2以下輸入採樣。在單位時間範圍內調用它們的S0到S3(乘以採樣週期後),並且您將從時間0到1進行插值.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是是容易解決方程的系統。從第二個減去第一個。

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 

一旦你有A,B,C和D,你可以把在時間t的多項式找到你已知樣本之間的樣本值。

重複對於每個輸出採樣,複用A,B,C & d如果下一個輸出樣本仍然是相同的2個輸入樣本之間。計算每個時間t類似於Bresenham直線算法,你只是通過不同數量的每一次進步。