Pull to refresh

Comments 39

нарисовать фолну

Поправьте в первом предложении.
Почему вы не пользуетесь ПМ?
Потому что автор не пользуется проверкой орфографии в браузере.
Почему struct.unpack не пользовали, а нампи?
Да, можно парсить через struct, не спорю. Но я где-то читал (к сожалению, не помню, где), что mathplotlib заточена под numpy, выше производительность по сравнению со стандартными списками. И кроме того, если со звуком будут выполняться какие-либо манипуляции (нормализация, фильтры, компрессия, преобразования Фурье), то лучше numpy-массивов ничего лучше быть не может.
Да, в том и дело, что в numpy массивы, а не списки. А массивы и существуют для обработки больших данных однородной информации. Кстати, вы повторяете ошибку и в статье, и в этом комментарии: Matplotlib пишется без h.
Меня топик чем-то зацепил, наверное я бессознательно тоже хочу waveform-ы на python рисовать :)
Интересно, что-то из готового пробовали приспособить?
С ходу гуглится такое и вот такое.
А еще scipy.io.wavfile.read.
Пробывал scipy.io.wavfile, у меня почему-то выдавало ошибку на некоторых файлах. Решил отложить scipy на потом.
Спасибо!
P.S: В скрипте удалите «r» в первом param:
wav = wave.open(r«music.wav», mode=«r»)
и в четвертом абзаце
а xe3\xfа — второго (правого).
Хороший выбор средств.

А вообще мне очень нравится, что с wave работать легко и просто, например нормально (для любых wav) повернуть звук задом наперёд занимает всего примерно 10 строк.
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
В модуле wave есть класс для записи wav-файла. В гугле можно найти примеры, как генерируют вейвы с шумом на основе random. А как читать звук с девайсов, к сожалению, не знаю.
440 гц :) = до, вроде так, не помню уже
там кучу гармоник еще делать, звучание струны + отражения других струн ну и реверберация внутри коробки.
Забейте, в наше время хиты делаются коктейлем white trash poser + autotune
вроде 440гц — это ля первой октавы.
Интересно, а звук в питоне получать со звуковухи можно? То есть, реально ли написать, например, тюнер с помощью каких-то уже реально существующих библиотек, как это сделано тут?
Конечно, можно. Например, с помощью pymedia.
Спасибо, попробую поковыряться, всегда было интересно что-нибудь такое написать
Можно вроде GStreamer pygst модуль зовется. Правда под win вроде не очень работает.
UFO just landed and posted this here
Конечно, я сверял график с другими программами.
Изображение с программы SoundBooth:


Мой график:


Видимо, меня подвел коэфициент k для прореживания графика. Чем он больше (ближе к числу сэмплов), тем лучше график.
Обновил код с новым коэффициентом.
ток акуратнее, на коротеньких файлах коэффициент может стать 0 а это вызовет ValueError: slice step cannot be zero
Слушайте, в этом скрипте нужно загружать весь файл в память… Соответственно очень большие файлы так не обработаешь ибо память закончится.

Можно-ли как то переделать на потоковую обработку? Считывать и обрабатывать пофреймово допустим...?
content = wav.readframes(nframes)
прочтите сколько надо фреймов, меняйте переменную nframes под количество байт в нем, читайте, принудительно удаляйте объекты или перезаписывайте буфер content.
Это я заметил, но мне кажется что будут проблемы с калибровкой высоты графика, ведь нужно макс. амплитуду знать чтобы разрешение по Y оси задать…
Можно в 2 прохода сделать конечно, но не очень приятная перспектива.
UFO just landed and posted this here
256^sampwidth чтоль? Переменная peak?
Если да, то ок, принимается. (Что за магическая константа 256?)

Хотя исходный скрипт довольно сильно переделывать придется. Надо будет заняться на досуге.

А matplotlib умеет данные по кусочкам принимать? (хотя после разрежения channel = channel[0::k] там объем данных очень сильно сократится, так что главное ДО процедуры разрежения все потоково проделать)

Да, надо будет заняться на досуге…
peak — это пиковое значение амплитуды. Зная, сколько байт выделяется под один сэмпл, можно высчитать ее максимальное значение: 256 (макс. амплитуда для 1 байта) возвести в степень числа байт на сэмпл и разделить пополам.
А по поводу чтения по кусочкам — совершенно верно, но это уже дальнейшая оптимизация.
А есть возможность получить громкость в дб в определённый момент времени? Грубо говоря сделать цикл от 0 сек до 60 сек?
Функция format_db, приведенная в коде, возвращает громкость в децибелах по амплитуде.
По коду похоже, что внутри конкретного фрейма и канала цифры обозначают только амплитуду. Как (и где) тогда в wav-файле хранится распределение по частотам?
Распределение по частотам нигде не хранится, эти данные извлекаются аналитически. Сейчас работаю над этим.
Гуглите по словам «wave frequency analyze»
Не гуглил, но кажется понял. У нас распределение по частотам образуется изменением амплитуды во времени (по фреймам). То есть, если нам нужна скажем одна волна частотой 1КГц, мы можем завести по 2000 фреймов в секунду и в каждом фрейме менять знак амплитуды. Так можно задать произвольную комбинацию волн, складывая амплитуды, соответствующие каждой волне, в каждом фрейме (а получить волны «обратно» можно каким-нибудь преобразованием Фурье).
А вы пробовали работать с 24-битными файлами? python.wave ведет себя странно — sample width == 3, но len(sample.readframes(1)) == 6

Похоже на баг библиотеки
Sign up to leave a comment.

Articles