2014-09-30 61 views
2

我有一個75赫茲的採樣數組,我想以128赫茲存儲它們。如果它是64赫茲和128赫茲,那很簡單,我只需加倍所有樣品。但是,如果採樣率不是海誓山盟的一小部分,那麼正確的方法是什麼?上採樣的正確方法是什麼?

+7

加倍所有樣品是不正確的方法來提高採樣率。 – interjay 2014-09-30 14:35:12

+0

@interjay你能詳細說明一下嗎? – Muis 2014-09-30 15:59:58

+1

答案已經做到了。重複樣品會增加噪音。查看答案或谷歌的正確方法的上採樣。 – interjay 2014-09-30 20:18:12

回答

2

如果你想避免過濾,然後您可以:

  1. 手柄信號集加入插值生成立方體曲線

    • ,但是這一點是一樣的,如果你使用線性插值
    • 不知道更多關於你的信號和目的的東西
    • 你不能構造valid個係數(不破壞信號的準確度)
    • 例如如何構建這樣立方這裏看看:my interpolation cubic
    • 子彈3那個鏈接裏面
    • 是我用
    • 我認爲有足夠的,甚至你的目的,所以你係數可以試戴
    • ,如果你想在這裏做自定義插值的樣子:how to construct custom interpolation curve
  2. 創建功能,可以在你的信號從開始點返回給定時間採樣

    • 所以這樣做double signal(double time);
    • 其中time是時間[S]從您需要訪問
    • ix = floor(time*75.0);其中4個樣本這個函數計算內部採樣
    • 開始讓你曲線開始點樣本索引
    • 立方需要4個點之前的一個曲線和一個...
    • 所以用於插值立方點p0,p1,p2,p3周使用的樣品ix-1,ix,ix+1,ix+2
    • 計算立方係數a0,a1,a2,a3
    • 計算三次曲線參數t(I使用範圍<0,1>),以便t=(time*75.0); t-=floor(t);

    enter image description here

    • 綠色 - 實際曲線段
    • AQUA - 實際曲線段控制點= 75。0赫茲樣品
    • 紅 - 曲線參數插值參數t
    • 灰色 - 實際時間
    • 抱歉,我忘了繪製實際輸出信號點應該是的綠色和灰色
  3. 的交點簡單地做for循環採樣數據與時間步長1/128小號

    • 是這樣的:

      double time,duration=samples*75.0,dt=1.0/128.0; 
      double signal128[???]; 
      for (time=0.0,i=0;time<duration;i++,time+=dt) 
      signal128[i]=signal(time); 
      
    • 樣品是在對輸入信號採樣數組大小由75.0赫茲

[註釋]

  • 爲/持續時間採樣可以對整數進行...
  • 將信號數據類型更改爲你所需要的d
  • signal(time)你需要處理邊界情況(開始和結束信號)
  • ,因爲你有沒有點定義在信號之前第一個樣本和最後一個樣本
  • 後,您可以複製它們或鏡像下一個點(鏡更好)
  • 這整個事情是可以改變的,以時間可持續過程無緩衝
  • 只需要記住信號4點,最後這樣你就可以通過2-3 75.0爲此在RT
  • 粗的
  • 你會被推遲Hz樣品...
  • ,當你把所有這些組合起來,你會看到,這是一個FIR濾波器反正:)
  • ,如果你需要保留更多的則一階導數增加更多的點...
+0

我會在'for'循環中使用與'i'的比較,因此您不必擔心導致緩衝區溢出的舍入錯誤。 – programmerjake 2014-10-01 09:16:18

1

最簡單的方法是上採樣到兩個採樣率的LCM的採樣率,然後下采樣 - 這樣您可以獲得整數上採樣/下采樣比。在你的情況下,在兩個採樣率中沒有共同的因素,所以你需要上採樣128到9.6千赫,然後下采樣75到128赫茲。對於上採樣,您可以在每個採樣之間插入127個採樣點,然後應用合適的濾波器(37 Hz LPF,Fs = 9.6 kHz),然後每採樣75次採樣一次。過濾器設計是唯一棘手的部分,但有一些在線工具可以幫助解決這個難題。

或者查看處理重採樣的第三方庫,例如sox

+0

我需要在普通C中實現過濾器,並且在我的設備中只有很少的RAM和CPU。沒有過濾可以做到這一點嗎? – Muis 2014-09-30 16:06:31

+0

這取決於你需要什麼樣的質量和準確度來重採樣。您可以使用線性插值進行原始重採樣,但會出現人爲因素。我們在這裏談論什麼樣的信號? – 2014-09-30 16:22:00

+0

它是一個PPG(體積描記)通道,它顯示脈搏波。通常這是一個8位通道,但我有16位採樣。難道如果我不過濾(包括artifiacts),它會比正確上採樣的8位通道更準確嗎?在這種情況下,它沒有問題。 – Muis 2014-09-30 16:35:27

0

您需要按中間採樣頻率上採樣和下采樣,如@Paul所述。此外,需要每個轉型,這可以通過線性插值爲實現後的信號進行過濾:

% Parameters 
F = 2; 
Fs1 = 75; 
Fs3 = 128; 
Fs2 = lcm(Fs1,Fs3); 

% Original signal 
t1 = 0:1/Fs1:1; 
y1 = sin(2*pi*F*t1); 

% Up-sampled signal 
t2 = 0:1/Fs2:1; 
y2 = interp1(t1,y1,t2); 

% Down-sampled signal 
t3 = 0:1/Fs3:1; 
y3 = interp1(t2,y2,t3); 

figure; 
subplot(3,1,1); 
plot(t1,y1,'b*-'); 
title(['Signal with sampling frequency of ', num2str(Fs1), 'Hz']); 
subplot(3,1,2); 
plot(t2,y2,'b*-'); 
title(['Signal with sampling frequency of ', num2str(Fs2), 'Hz']); 
subplot(3,1,3); 
plot(t3,y3,'b*-'); 
title(['Signal with sampling frequency of ', num2str(Fs3), 'Hz']); 

enter image description here

2

你不需要上採樣,然後下采樣。相反,可以使用足夠寬的低通內插內核(例如加窗Sinc函數)以期望的時間間隔內插所有新採樣點。這通常是通過直接使用預先計算的多相濾波器組或直接使用濾波器表的附加線性內插來完成的。但是如果性能不重要,那麼可以直接計算每個插值點的每個係數。

相關問題