我有一個75赫茲的採樣數組,我想以128赫茲存儲它們。如果它是64赫茲和128赫茲,那很簡單,我只需加倍所有樣品。但是,如果採樣率不是海誓山盟的一小部分,那麼正確的方法是什麼?上採樣的正確方法是什麼?
回答
如果你想避免過濾,然後您可以:
手柄信號集加入插值生成立方體曲線
- ,但是這一點是一樣的,如果你使用線性插值
- 不知道更多關於你的信號和目的的東西
- 你不能構造
valid
個係數(不破壞信號的準確度) - 例如如何構建這樣立方這裏看看:my interpolation cubic 子彈3那個鏈接裏面
- 是我用
- 我認爲有足夠的,甚至你的目的,所以你係數可以試戴
- ,如果你想在這裏做自定義插值的樣子:how to construct custom interpolation curve
創建功能,可以在你的信號從開始點返回給定時間採樣
- 所以這樣做
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);
- 綠色 - 實際曲線段
- AQUA - 實際曲線段控制點= 75。0赫茲樣品
- 紅 - 曲線參數插值參數t
- 灰色 - 實際時間
- 抱歉,我忘了繪製實際輸出信號點應該是的綠色和灰色
- 所以這樣做
的交點簡單地做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濾波器反正:)
- ,如果你需要保留更多的則一階導數增加更多的點...
我會在'for'循環中使用與'i'的比較,因此您不必擔心導致緩衝區溢出的舍入錯誤。 – programmerjake 2014-10-01 09:16:18
最簡單的方法是上採樣到兩個採樣率的LCM的採樣率,然後下采樣 - 這樣您可以獲得整數上採樣/下采樣比。在你的情況下,在兩個採樣率中沒有共同的因素,所以你需要上採樣128到9.6千赫,然後下采樣75到128赫茲。對於上採樣,您可以在每個採樣之間插入127個採樣點,然後應用合適的濾波器(37 Hz LPF,Fs = 9.6 kHz),然後每採樣75次採樣一次。過濾器設計是唯一棘手的部分,但有一些在線工具可以幫助解決這個難題。
或者查看處理重採樣的第三方庫,例如sox。
您需要按中間採樣頻率上採樣和下采樣,如@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']);
你不需要上採樣,然後下采樣。相反,可以使用足夠寬的低通內插內核(例如加窗Sinc函數)以期望的時間間隔內插所有新採樣點。這通常是通過直接使用預先計算的多相濾波器組或直接使用濾波器表的附加線性內插來完成的。但是如果性能不重要,那麼可以直接計算每個插值點的每個係數。
- 1. 什麼是採用NSCopying協議的正確方法?
- 2. reactjs中的正確方法是什麼?
- 3. C++ API - 什麼是正確的方法
- 4. 什麼是正確的設計方法?
- 5. 這是做什麼的正確方法?
- 6. QSqlDatabase&QSqlQuery的正確方法是什麼?
- 7. 混合8bit 8000Hz PCM_ULAW採樣最簡單的方法是什麼?
- 8. 爲什麼對象上的方法是正確的?
- 9. 什麼是正確或正確的方法來讀取HTTP上的RFC?
- 10. Tensorflow採樣Softmax丟失正確用法
- 11. 在select2上禁用ajax緩存的正確方法是什麼?
- 12. 在python 2.6.5上使用idlestartup的正確方法是什麼?
- 13. 在Linux上安裝jdk的正確方法是什麼
- 14. 在playn上管理視圖的正確方法是什麼?
- 15. 在TextField上使用setValue的正確方法是什麼?
- 16. 畢竟,在Linux上設置Tensorflow的正確方法是什麼?
- 17. 什麼是從方法訪問字段的正確方法
- 18. 什麼是使用AttributeCollection.Render方法的正確方法?
- 19. 在python中派生類方法的正確方法是什麼?
- 20. 重寫泛型方法的正確方法是什麼?
- 21. 實現NUnit 2.5 Constraint.Write *()方法的正確方法是什麼?
- 22. 什麼是使用findBy'Field方法的正確方法?
- 23. 調用d.dispose()或s.cancel()方法的正確方法是什麼?
- 24. 過採樣方法
- 25. 什麼是確定應用程序位置的正確方法?
- 26. 確保EntityManager連接關閉的正確方法是什麼?
- 27. 確保單個課程實例的正確方法是什麼?
- 28. 確認向Web API提交的正確方法是什麼?
- 29. 確定AJAX調用成功的正確方法是什麼?
- 30. 什麼是確認ATA/IDE中斷的正確方法?
加倍所有樣品是不正確的方法來提高採樣率。 – interjay 2014-09-30 14:35:12
@interjay你能詳細說明一下嗎? – Muis 2014-09-30 15:59:58
答案已經做到了。重複樣品會增加噪音。查看答案或谷歌的正確方法的上採樣。 – interjay 2014-09-30 20:18:12