(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
}
1条答案
按热度按时间pw9qyyiw1#
算法
他们使用不同的公式来计算汉明窗
R
中,(25/46)-(21/46)* cos(2 * pi *(0:n)/N)
输入
hamming
时可以查看MATLAB
中,算法是(参见https://se.mathworks.com/help/signal/ref/hamming.html)和 * 两个系数 * 有一定的精度差异
分析
造成差异的两个原因
1.在
gsignals::hamming
中,如果默认选择symmetric
,则将有N <- n-1
和n <- n-1
,这意味着与Matlab的hamming
等效的应该是hamming(76+1)
0.54
和0.46
导致了与R版本的偏差。手工实现测试
我们可以分别根据
MATLAB
和R
中的公式实现hamming
函数,例如,然后运行
我们可以检查结果窗口的长度
频谱性能
给定
n <- 75
,我们可以使用freqz
来查看频域中的差异。我们可以看到,差异主要在于阻带,但仍然很小,这并不影响滤波性能太多。freqz(hamR(n))
freqz(hamMatlab(n))