Проблемы, возникающие при расчете БПФ файлов WAV - PullRequest
2 голосов
/ 25 апреля 2020

Я пытался найти БПФ-преобразование файлов .wav. Моя начальная программа (для графика AMplitude - TIme)

data_dir = 'C:/Users/asus/Desktop/Song_Test/Split/Done1.wav'

audio1, sfreq = lr.load(data_dir)
len(audio1), sfreq
Duration = len(audio1)/sfreq
print(Duration, " seconds")
time = np.arange(0, len(audio1)) / sfreq
fig, ax = plt.subplots()
ax.plot(time, audio1)
ax.set(xlabel='Time (s)', ylabel='Sound Amplitude')
plt.show()

Вот функция, которую я до сих пор запрограммировал.

import scipy
def fft_plot(audio, sampling_rate):
    n = int(len(audio))
    T = 1 / sampling_rate
    yf = scipy.fft.fft(audio)
    print(n, T)
    xf = np.linspace(0.0, 1.0/(2.0*T), n/2.0)
    fig, ax = plt.subplot()
    ax.plot(xf, 2.0/n * np.abs(yf[:n//2]))
    plt.grid()
    plt.xlabel("Freq")
    plt.ylabel("Magnitude")
    return plt.show()

В тот момент, когда я вызываю этот модуль, используя fft_plot(audio1, sfreq)

Появляется следующая ошибка

Traceback (most recent call last):
  File "C:\Users\asus\anaconda3\envs\untitled\lib\site-packages\numpy\core\function_base.py", line 117, in linspace
    num = operator.index(num)
TypeError: 'float' object cannot be interpreted as an integer

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/asus/PycharmProjects/untitled/Librosa_level2.py", line 92, in <module>
    fft_plot(audio1, sfreq)
  File "C:/Users/asus/PycharmProjects/untitled/Librosa_level2.py", line 59, in fft_plot
    xf = np.linspace(0.0, 1.0/(2.0*T), n//2.0)
  File "<__array_function__ internals>", line 6, in linspace
  File "C:\Users\asus\anaconda3\envs\untitled\lib\site-packages\numpy\core\function_base.py", line 121, in linspace
    .format(type(num)))
TypeError: object of type <class 'float'> cannot be safely interpreted as an integer.

Как мне решить эту проблему с плавающей точкой, пожалуйста, помогите мне?

1 Ответ

2 голосов
/ 25 апреля 2020

Третий аргумент:

xf = np.linspace(0.0, 1.0/(2.0*T), n/2.0)

, то есть n / 2.0, должен быть целым числом:

num : int, optional
Number of samples to generate. Default is 50. Must be non-negative.

Проверьте документы для получения подробной информации.

Ваш n является целым числом, но когда вы делите на 2.0, вы можете получить дробь (действительное число). В терминах Python (и в подавляющем большинстве других языков программирования) вы всегда будете получать число с плавающей точкой, если делите целое число на число с плавающей точкой.

Решение

Убедитесь, что вы передали четное число, например:

if n % 2 == 0:
    pass # Even 
else:
    n -= 1
...