Как заставить Python загружать большой (2 часа) волновой файл и преобразовывать его содержимое в частотно-временной массив? - PullRequest
1 голос
/ 17 января 2012

Я хотел бы получить доступ к массиву с помощью чего-то вроде array [5000] [440], означающего 5000 мс от начала и 440 Гц, и это дало бы мне значение амплитуды частоты в этой самой позиции.

Iне могу найти что-то подобное здесь, если есть, пожалуйста, укажите мне на это.

Ответы [ 3 ]

2 голосов
/ 18 января 2012

Вы в основном хотите спектрограмму .Чтобы начать, просмотрите ваш звуковой файл небольшими порциями, где каждый фрагмент, скажем, 1/10 секунды, и БПФ каждого из этих фрагментов.(Тогда, конечно, чтобы посмотреть 5000 мс и 440 Гц, перейдите к БПФ соответствующего блока.)

0 голосов
/ 19 января 2012

Вы можете конвертировать время и частоты на лету.Вы должны использовать __getitem__ и, вероятно, lru_cache для хранения некоторых значений для дальнейшего использования.

Допустим, что Фурье что-то вроде этого

class Fourier():
   def __init__(self,a=10):
      self.a=a
   def __getitem__(self, index): 
      #this is function that calculates and returns value of my_furier
      return self.a+index

t=Fourier()
print(t[12.4])

Вы можете применить то же самое для доступавремя из Фурье.Таким образом, вы можете создать новый объект времени, который позволит вам выбрать любое допустимое время и вернуть его, или использовать какую-то интерполяцию для возврата значений, которых нет в таблице.

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

0 голосов
/ 18 января 2012

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

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

Как только вы получите результаты БПФ, числа будут соответствовать частотам, но это не будет простым отношением. У вас нет никакого контроля над частотой, соответствующей каждому выходу, которая уже была определена частотой дискретизации вашего сигнала в сочетании с количеством выборок. Боюсь, у меня нет формулы преобразования под рукой. Каждая частота будет состоять из двух компонентов: реальной и мнимой, а амплитуда будет sqrt(r**2+i**2).

...