名称错误:未定义名称“nmax”

2024-09-30 20:25:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有个错误, 名称错误:未定义名称“nmax”。 回溯就像

  Traceback (most recent call last):
  File "mfcc.py", line 143, in <module>
    tmp=get_feature(wavfile,nfft,nceps)
  File "mfcc.py", line 135, in get_feature
    ceps = mfcc(wavdata,nfft,fs,nceps)
  File "mfcc.py", line 97, in mfcc
    spec = np.abs(np.fft.fft(signal,nfft))[:nmax]
NameError: name 'nmax' is not defined

我的密码

^{pr2}$

我在代码中使用全局变量编写了nmax,因此我不知道为什么会出现此错误。全局变量不能在所有文件中使用,对吗?那么,我该怎么解决这个问题呢?在


Tags: inpyfft名称get错误npline
2条回答

问题不在于你使用全局变量本身。问题是当您在mfcc()中调用abs()时,nmax尚未定义,因为直到稍后在函数中调用melFilterBank()时才会发生这种情况。将nmax的定义移到mfcc()的开头:

def mfcc(signal,nfft,fs,nceps):
    global nmax 
    nmax = nfft/2

    p = 0.97 
    signal = preEmphasis(signal,p)

    hammingWindow = np.hamming(len(signal))
    signal = signal * hammingWindow

    spec = np.abs(np.fft.fft(signal,nfft))[:nmax]
    fscale =np.fft.fftfreq(nfft,d=1.0/fs)[:nmax]

    numChannels = 20 
    df = fs/nfft 
    filterbank,fcenters = melFilterBank(fs,nfft,numChannels)

    mspec = np.log10(np.dot(spec,filterbank.T))
    ceps = scipy.fftpack.realtransforms.dct(mspec,type=2,norm="ortho",axis=-1)
    return ceps[:nceps]

但是,在当前代码中,我不希望使用global,而是显式地传递所需的参数。在

在函数melFilterBanks中定义nmax。但在之后调用它,您使用nmax变量。 所以nmax在你调用它之前不会初始化。在

你错在这里了:

spec = np.abs(np.fft.fft(signal,nfft))[:nmax]
fscale =np.fft.fftfreq(nfft,d=1.0/fs)[:nmax]

snip

filterbank,fcenters = melFilterBank(fs,nfft,numChannels)

因此,要么在使用nmax之前调用melFilterBank,要么在调用melFilterBank之后定义spec和{}。在

相关问题 更多 >