首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >朱莉娅DSP周期图n> nfft是错误,为什么?

朱莉娅DSP周期图n> nfft是错误,为什么?
EN

Stack Overflow用户
提问于 2022-06-25 16:09:15
回答 1查看 76关注 0票数 2

代码语言:javascript
复制
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)

抛出错误

代码语言:javascript
复制
nfft must be >= n

但文件上说:

代码语言:javascript
复制
If length(s) < nfft, then the input is padded with zeros. 

这不意味着nfft

EN

回答 1

Stack Overflow用户

发布于 2022-06-25 19:27:34

为了防止混叠,我认为nfft长度应该大于信号长度n

periodogram函数内部使用FFT,其中长度表示为nfft。理论上,在采用快速傅立叶变换时,信号在时域和频域都是离散的和周期性的,周期由nfft给出。因此,如果您指定的nfft小于信号长度n,这实际上在时域引入混叠,使信号与nfft周期。

例如,如果您有一个序列1 2 3 4 5,假设您的句点也是5,那么

代码语言:javascript
复制
1 2 3 4 5
          1 2 3 4 5
                    1 2 3 4 5
--------------------------------
      ... 1 2 3 4 5 ...

也就是说,原始序列。现在假设您有一个周期的3,那么它看起来

代码语言:javascript
复制
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就是这样做的。

代码语言:javascript
复制
function wrap(x,nfft)
    y = zeros(eltype(x),nfft)
    for (i,xi) in enumerate(x)
        y[mod1(i,nfft)] += xi
    end
    y
end

例如:

代码语言:javascript
复制
wrap(1:5,3)
3-element Vector{Int64}:
 5
 7
 3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72755400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档