簡體   English   中英

用於上采樣的PCM算法

[英]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文件的一個很好的鏈接:

http://www.labbookpages.co.uk/audio/javaWavFiles.html

不確定標題,但我會研究三次樣條插值。 你可以看一下這個網站 它有一種非常簡潔的方式來執行三次插值。 我不確定如何修改標題,但我很確定在Stack Overflow上有可以搜索的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM