为什么R的汉明函数与Matlab的不同?

Tpe*_*irn 11 matlab signal-processing r function

为什么hammingR中的函数与Matlab中的同名函数给出不同的值?

MATLAB:

hamming(76)

    0.0800
    0.0816
    0.0864
    0.0945
    0.1056
    0.1198
Run Code Online (Sandbox Code Playgroud)

回复:

library(gsignal)
hamming (76)

0.08695652 0.08851577 0.09318288 0.10092597 0.11169213 0.1254078
Run Code Online (Sandbox Code Playgroud)

Tho*_*ing 19

算法

他们遵循不同的公式(格式相同但系数不同)来计算汉明窗

  • 在 中R,它是

(25/46) - (21/46) * cos(2 * pi * (0:n)/N)

打字时可以看到hamming

> hamming
function (n, method = c("symmetric", "periodic")) 
{
    if (!isPosscal(n) || !isWhole(n) || n <= 0)
        stop("n must be an integer strictly positive")
    method <- match.arg(method)
    if (method == "periodic") {
        N <- n
    }
    else if (method == "symmetric") {
        N <- n - 1
    }
    else {
        stop("method must be either 'periodic' or 'symmetric'")
    }
    if (n == 1) {
        w <- 1
    }
    else {
        n <- n - 1
        w <- (25/46) - (21/46) * cos(2 * pi * (0:n)/N)
    }
    w
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

两个系数存在一定的精度差异

> 25/46
[1] 0.5434783
> 21/46
[1] 0.4565217
Run Code Online (Sandbox Code Playgroud)

分析

造成差异的两个原因

  1. 在 中gsignals::hamming,如果您symmetric默认选择,您将得到N <- n-1n <- n-1,这意味着与 Matlab 等效的hamming应该是hamming(76+1)
  2. Matlab 中的近似值0.540.46导致与 R 版本的偏差。

手工实现的测试

我们可以hamming分别根据MATLAB和 的公式来实现函数R,例如,

hamMatalb <- function(n) 0.54 - 0.46 * cos(2 * pi * (0:n) / n)
hamR <- function(n) 25 / 46 - 21 / 46 * cos(2 * pi * (0:n) / n)
Run Code Online (Sandbox Code Playgroud)

然后运行

> hamMatalb(75) # the same as obtained by hamming(76) in MATLAB
 [1] 0.08000000 0.08161328 0.08644182 0.09445175 0.10558687 0.11976909
 [7] 0.13689893 0.15685623 0.17950101 0.20467443 0.23219992 0.26188441
[13] 0.29351967 0.32688382 0.36174283 0.39785218 0.43495860 0.47280181
[19] 0.51111636 0.54963351 0.58808309 0.62619540 0.66370312 0.70034314
[25] 0.73585847 0.77000000 0.80252824 0.83321504 0.86184514 0.88821773
[31] 0.91214782 0.93346756 0.95202741 0.96769718 0.98036697 0.98994790
[37] 0.99637276 0.99959650 0.99959650 0.99637276 0.98994790 0.98036697
[43] 0.96769718 0.95202741 0.93346756 0.91214782 0.88821773 0.86184514
[49] 0.83321504 0.80252824 0.77000000 0.73585847 0.70034314 0.66370312
[55] 0.62619540 0.58808309 0.54963351 0.51111636 0.47280181 0.43495860
[61] 0.39785218 0.36174283 0.32688382 0.29351967 0.26188441 0.23219992
[67] 0.20467443 0.17950101 0.15685623 0.13689893 0.11976909 0.10558687
[73] 0.09445175 0.08644182 0.08161328 0.08000000

> hamR(75) # the same as obtained by gsignal::hamming(76) in R
 [1] 0.08695652 0.08855761 0.09334964 0.10129899 0.11234992 0.12642490
 [7] 0.14342521 0.16323161 0.18570516 0.21068824 0.23800559 0.26746562
[13] 0.29886168 0.33197355 0.36656897 0.40240529 0.43923112 0.47678818
[19] 0.51481302 0.55303893 0.59119778 0.62902190 0.66624601 0.70260898
[25] 0.73785576 0.77173913 0.80402141 0.83447617 0.86288979 0.88906296
[31] 0.91281211 0.93397064 0.95239015 0.96794144 0.98051542 0.99002390
[37] 0.99640019 0.99959955 0.99959955 0.99640019 0.99002390 0.98051542
[43] 0.96794144 0.95239015 0.93397064 0.91281211 0.88906296 0.86288979
[49] 0.83447617 0.80402141 0.77173913 0.73785576 0.70260898 0.66624601
[55] 0.62902190 0.59119778 0.55303893 0.51481302 0.47678818 0.43923112
[61] 0.40240529 0.36656897 0.33197355 0.29886168 0.26746562 0.23800559
[67] 0.21068824 0.18570516 0.16323161 0.14342521 0.12642490 0.11234992
[73] 0.10129899 0.09334964 0.08855761 0.08695652
Run Code Online (Sandbox Code Playgroud)

我们可以检查生成的窗口的长度

> length(hamMatalb(75))
[1] 76

> length(hamR(75))
[1] 76
Run Code Online (Sandbox Code Playgroud)

光谱性能

给定n <- 75,我们可以使用 来查看频域中的差异freqz。我们可以看到,差异主要在于阻带,但仍然很小,不会对滤波性能产生太大影响。

  • freqz(hamR(n))

在此输入图像描述

  • freqz(hamMatlab(n))

在此输入图像描述

  • @r2evans AFAIK,Hamming 本人建议使用舍入数字,我想这就是 MATLAB 使用它们的原因。25/46 是第一个旁瓣被取消的位置,这是汉明约束的精确解。使用 0.53836 代替可以获得最低的旁瓣,这实际上更好。舍入值位于这两个解决方案之间。但它们之间的差异很小,如果您的信号使用 8 位,则差异并不明显。 (4认同)
  • +1,你使用完全相同的链接和几乎相同的算法图像击败了我,得到了这部分答案。(我仍然认为核心问题是 `gsignal::hamming(76)` 产生的数字与发布的 OP 不同。也许如果您扩展示例以手动计算 `n=76` 和 `n=77`,它会提供更多的见解。) (3认同)
  • @SamR从光谱分析的角度来看,它的差异可以忽略不计。您可以看到我关于光谱分析的最新更新。 (2认同)