这
n = length(s)
# n = 25920169
nfft = 8192
noverlap = Int64(floor(nfft/2))
window = hanning(nfft)
#sp = spectrogram(s, n, noverlap; nfft=nfft, fs=1, window=window)
sp = periodogram(s; nfft=nfft, fs=1, window=window)抛出错误
nfft must be >= n但文件上说:
If length(s) < nfft, then the input is padded with zeros. 这不意味着nfft
发布于 2022-06-25 19:27:34
为了防止混叠,我认为nfft长度应该大于信号长度n。
periodogram函数内部使用FFT,其中长度表示为nfft。理论上,在采用快速傅立叶变换时,信号在时域和频域都是离散的和周期性的,周期由nfft给出。因此,如果您指定的nfft小于信号长度n,这实际上在时域引入混叠,使信号与nfft周期。
例如,如果您有一个序列1 2 3 4 5,假设您的句点也是5,那么
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
--------------------------------
... 1 2 3 4 5 ...也就是说,原始序列。现在假设您有一个周期的3,那么它看起来
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
------------------------
... 5 7 3 ...当您使用n > nfft对这个序列进行快速傅立叶变换时,您正在处理这个别名序列。
您可以手动允许n > nfft,通过应用wrap(x,nfft)作为下面并将其输出提供给periodogram,MATLAB就是这样做的。
function wrap(x,nfft)
y = zeros(eltype(x),nfft)
for (i,xi) in enumerate(x)
y[mod1(i,nfft)] += xi
end
y
end例如:
wrap(1:5,3)
3-element Vector{Int64}:
5
7
3https://stackoverflow.com/questions/72755400
复制相似问题