查找 scipy.fftpack.in Python 创建的数组中特定值的位置



我需要在数组中找到 n 个特定值的位置,FFT在这种情况下,值为max2 = 4403226.763754396

import scipy.io.wavfile as wavfile
import scipy
import scipy.fftpack as fftpk
import numpy as np
from matplotlib import pyplot as plt
# Reads VAV file
s_rate, signal = wavfile.read("A0.wav")

''' Plotting 211'''
# Plot signal in time domain
plt.subplot(211)
plt.plot(signal)
plt.xlabel('Time (Sec)')
plt.ylabel('Amplitude')

''' Printing Signals, Freq and FTT '''
print ('n''Signal''n')
print signal
len1 = len(signal)
print ('n'+'Number of elements: ' + str(len1) + ' n')
#print (' '.join(map(str, signal))) 
FFT = abs(scipy.fft(signal))
freqs = fftpk.fftfreq(len(FFT), (1.0/s_rate))
# Print not treated freq
print ('n' + "Freq (not treated)" + 'n')
print (freqs)
len2 = len(freqs)
print ('n'+'Number elements in freq: ' + str(len2) + ' n')
#Print freq after FFT
print ('n' + "FFT" + 'n')
print FFT
len3 = len(FFT)
print ('n'+'Number elements in FTT: ' + str(len2) + ' n')

''' Plotting 212 '''
# Plotting signal in Frequency Domain
plt.subplot(212)
freq0 = len(FFT)//2
freq1 = range(len(FFT)//2)
#Prints all freq (Hz)
#print freq1
plt.plot(freqs[range(len(FFT)//2)], FFT[range(len(FFT)//2)])                                                          
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
''' Printing treated signal '''
print ('n' + "Freq ( treated)" + 'n')
#print (freq1)
len2 = len(freq1)
print ('n'+'Number elements in freq (tretaed): ' + str(len2) + ' n')
''' List edit Signal '''
# Sorting the list 
freqs.sort()
max1 = max(freqs[range(len(FFT)//2)])
# Printing the largest element 
print('n'+'Largest element of the signal is:' + str(max1) + 'n')
''' List edit FTT '''
# Sorting the list 
FFT.sort()
# Saving max element of FTT in var
max2 = max(FFT)
# Printing the largest element of Amplitude
print('Largest element of the amplitude is:' + str(max2) + 'n')

''' List edit Freq'''
freq1.sort()
max3 = max(freq1)
print('Largest element of the freq is:' + str(max3) + 'n')
# INSERT FUNCTION FOR ARRAY INDEX HERE
''' Plotting last graph '''
# Plotting graphs
plt.show()
#range(len(FFT)//2)

我需要它,以便我可以确定特定频率中振幅最高的点。

如果您有兴趣,请点击此处查看wav文件:https://sndup.net/39bc

你的代码有点复杂,但如果我理解正确的话,你要问的是如何找到最大值的位置(沿 x 轴(。我不知道这个数组来自FFT的事实是如何相关的。

如果这就是你要问的,我相信已经回答了,例如,这是相关的: 获取多维 numpy 数组中最大项目的位置

一个简短的答案是使用 np.argmax 或 np.argwhere。例如:

import numpy as np
x = np.linspace(0, 10, 101)
y = 2 - (x - 5)**2
print('max value:', np.argmax(y))
print('max position', x[np.argmax(y)])

输出应为

max value: 50
max position 5.0

在前面的示例中,我还可以查找与特定 y 值对应的 x 值。例如:其中 y 为 -22.01:

x[np.argwhere(np.isclose(y, -22.01))]

输出为:

array([[0.1],
[9.9]])

我猜在你的代码中这将是这样的:

freqs[np.argmax(FFT)]
# or
freqs[np.argwhere(np.isclose(FFT, 4403226.763754396))]

注意我使用了 np.isclose,因为有时由于浮点精度,相等性不成立。

最新更新