[英]PCM algorithm for upsampling
我有8k16bit pcm音頻,我想將其上采樣到16k16bit。 我必須手動完成此操作。
有人能告訴我線性插值的算法嗎? 我應該在每兩個字節之間進行插值嗎?
此外,當我進行上采樣時,我必須對wav標題進行更改 - 我應該更改什么?
正如其他人所提到的,線性插值不能提供最佳音質,但它簡單而便宜。
對於您創建的每個新樣本,只需將其與下一個樣本進行平均,例如
short[] source = ...;
short[] result = new short[source.length * 2];
for(int i = 0; i < source.length; ++i) {
result[i * 2] = source[i];
result[i * 2 + 1] = (source[i] + source[i + 1]) / 2;
}
你一定要搜索一個可以幫助你處理WAV文件的庫。 即使它是一種簡單的格式,如果有可用的代碼可以滿足您的需要,您也不必自己動手。 順便問一下,你為什么要這樣做呢? 也許你可以使用sox或類似的工具來做到這一點。
有人能告訴我線性插值的算法嗎? 我應該在每兩個字節之間進行插值嗎?
當然:
double interpolate_linear(double a, double b, double x) {
assert(0.0 <= x);
assert(1.0 >= x);
if (0.0 >= x)
return a;
else if (1.0 <= x)
return b;
else
return (1.0 - x) * a + x * b;
}
線性插值雖然總比沒有好,但誤差很大。 如果你有cpu時間,最好是零填充和窗口。
此外,當我進行上采樣時,我必須對wav標題進行更改 - 我應該更改什么?
對java不確定。
這是在java中使用WAV文件的一個很好的鏈接:
不確定標題,但我會研究三次樣條插值。 你可以看一下這個網站 。 它有一種非常簡潔的方式來執行三次插值。 我不確定如何修改標題,但我很確定在Stack Overflow上有可以搜索的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.