Как получить список амплитуд и частот из файла WAV - PullRequest
0 голосов
/ 05 мая 2019

Мы пытаемся создать программу для получения списка амплитуд и частот из файла .wav, пробуем его на Python.

Мы пробовали pyaudio, потому что я мало что знаю о pyaudio, поэтому мне нужнонекоторые предложения по этому вопросу.

import scipy
import numpy as np

file = '123.wav'
from scipy.io import wavfile as wav
fs, data = wav.read(file)
length=len(data.shape)
#if length==2:
#    data= data.sum(axis=1)/2
n = data.shape[0]
sec = n/float(fs)
ts = 1.00/fs
t = scipy.arange(0,sec,ts)
FFT = abs(scipy.fft(data))
FFT_size = FFT[range(n//2)]
freq = scipy.fftpack.fftfreq(data.size, t[1]-t[0])
max_freq = max(freq)
min_freq = min(freq)
plot_freq(freq, n, t, data)

Фактический результат, возвращаемый в списке частот.Я также хочу список амплитуд не знаю, как его получить.

Ответы [ 3 ]

0 голосов
/ 05 мая 2019

Возможно, вы захотите высоту звука, а не спектральную частоту, что является алгоритмом, отличным от простого использования БПФ для нахождения наибольшей величины. FFT возвращает весь спектральный частотный диапазон (каждая частота до Fs / 2, а не только одну частоту), в вашем случае для всего файла. И самая высокая величина часто не для частоты основного тона (возможно, для некоторого высокого обертона вместо этого).

Вы также взяли БПФ всего файла, а не кучу БПФ для временных интервалов (обычно с небольшими перекрывающимися окнами) во временном приращении, которое требуется для временного разрешения вашего списка. Это создаст временной массив всех частотных массивов БПФ (таким образом, двумерный массив). Обычно называется спектрограммой. В некоторых библиотеках для этого может быть встроенная функция.

0 голосов
/ 13 мая 2019

Можно ли из этой формулы сделать амплитуду

частота волны задается тем, что движет колебания в среде.Примерами являются динамик, который настраивает звуковую волну, или рука, которая встряхивает конец натянутой струны.Скорость волны является свойством среды.длина волны затем определяется частотой и скоростью: λ = v / f

Я не знаю, будет ли это правильный процесс или нет

0 голосов
/ 05 мая 2019

обычно вызов API fft возвращает массив мнимых чисел, где каждый элемент массива содержит комплексное число в форме (Areal, AImaginary), где каждый элемент массива представляет частоту (значение частоты равно подразумевается индексом массива [найти формулу для вычисления частоты на основе индекса массива])

в элементе комплексного массива 0 представляет частоту 0, которая является вашим смещением постоянного тока, тогда частота каждого последующего значения частоты вычисляется с использованием

incr_freq := sample_rate / number_of_samples

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

... при выполнении итерации по этому массиву комплексных чисел рассчитайте амплитуду, используя Areal и AImaginary комплексного числа каждого частотного бина, используя формулу

curr_mag = 2.0 * math.Sqrt(curr_real*curr_real+curr_imag*curr_imag) / number_of_samples

при выполнении итерации по сложному массиву, возвращенному из вызова fft, помните о понятии Предел Найквиста , что означает, что вы потребляете только первую половину числа элементов этого сложного массива (и удваиваете величину каждой частоты - см. формулу выше)

... см. Полный псевдокод в Получить частоту с наибольшей амплитудой из FFT

... я запустил твой код и ничего не случилось ... в чем смысл твоего питона

* * Тысяча двадцать-один [диапазон (п // 2)]
...