Пока без шапки, надеюсь накидаем что-нибудь
Фрагмент сигнала, скажем, 0.1 секунды умножается на оконную функцию, потом делается быстрое преобразование фурье, берется абсолютное значение и логарифмическая шкала по частоте. Ну либо, куча кроссовер-фильтров с очень крутой ачх, и так же абсолютное значение
Cпасибо анон. Оконная функция это та которая пробегает по всему массиву и делает финальный результат типа reduce? Или это что-то сложней, типа scan?
Преобразование Фурье на самом деле получается не от фрагмента сигнала, а от этого фрагмента, повторенного бесконечность раз назад и вперед. При этом на краях у реального сигнала будет скорее всего резкий разрыв, который внесет сильный "искажения" в высокочастотную часть спектра. Не совсем правильно называть это искажениями. Поэтому сигнал предварительно умножают на оконную функцию. Она просто плавно зануляет края.
см ОП пик
Вот сейчас нарисовал это и понял вдруг, что неплохо бы попробовать оконную функцию, которая устраняет разрывы на краях еще и в парочке производных. Слава Резиновой Уточке!
Лет пятнадцать назад, еще в 32-битном мире, делал линейку VST-эффектов для обработки звука. Прицел был на гитару, но по отзывам в интернете оказалось, что пользуются в основном даже не с гитарой. У меня там были не слишком сильно отличающаяся от оригинала эмуляция Boss MT-2, фильтр шума делением спектра, хорус со сдвигом частот. Потом ушел от этой темы, но вроде все еще могу что-нибудь пояснить, если кому-нибудь это интересно.
Кстати, остались нерешенными некоторые задумки:
# Применение длинного преобразования Фурье, но с короткой латентностью.
# Деление спектра 0 / 0 с помощью правила Лопиталя, если первая производная тоже 0 / 0, то можно взять вторую. А теперь даже нейросети можно в этом домене применять.
На пикрелейтедах апскейл x2 бикубиком в фотошопе, а потом деление на спектр функции Гаусса с помощью либы libfftw. Нейросети делают такое не намного лучше, но очень намного дольше.
https://pastebin.com/9Uty8cRh
P.S. основные функции в которых происходит всё действо это
makeFFT и addIQ.
На вход addIQ надо подать байтный массив комплексных 32 битных чисел типа int.
В функции makeFFT dB_buffer - это то что уже можно использовать для визуализации музыки. Ну а вот как правильно оцифровывать всё это я хз.
1) Линейная комбинация это k1x1 + k2x2 + ... + kNxN
2) Ортогональная система функций позволяет представить любую другую (с некоторыми ограничениями) функцию в виде линейной комбинации функций этой системы
3) Синусы с различной частотой и фазой как раз и являются ортогональной системой функций
4) Любой сигнал можно представить в виде линейной комбинации синусов. Нахождение коэффициентов этой комбинации и есть преобразование Фурье
5) Преобразование Фурье хорошо оптимизируется. Алгоритм называется БПФ. Первым придумал Гаусс, потом переизобрели два чувака из MIT. Всё это было задолго до появления компьютеров.
6) Основное применение строго по матану - это свертка функций. Всякие деления и вычитания амплитуд спектров - это уже интересные "извращения".
>>015859 >>015870
1) Может, лучше не наследовать от классов Qt, так получится более универсально.
2) Либа libfftw иногда не очень предсказуема. Сталкивался с тем, что она сильно накапливает ошибку при преобразовании вперед-назад, что проявляется в виде слышимого шума. Также она иногда может создать очень медленный "план", сталкивался с этим при 2D-преобразовании. Также у либы гротескно-оверпрайснутая лицензия для коммерческого софта.
Интересный ты перец брат. Поясни про оверпрайс.
https://www.fftw.org/
Там же гпл лицензия.
Похуй в принципе, тему интересную ты поднял. Студент?
Может я че напутал, но они (fftw) вроде просили раньше 5k$ за применение в проприетарном софте. Для комерсов это фигня, но для стартапов в одно рыло это жеско. Поэтому я просто написал свое БПФ на интринсиках, которое всего в два раза медленнее fftw, но зато супер простое и предсказуемое и заодно могу легко скомпилить под WebAssembly, чтобы оно вертелось в браузере.
На самом деле, хотя все алгоритмы и есть в либах, но периодически встречаются кейсы, когда имеет смысл переписать самому, или более мягкий вариант например обернуть сишную либу в питон. Из последнего, что я обернул, модуль - dict для питона на основе xxhash с забиванием буя на коллизии - очень сильная экономия памяти + скорость. Потом опять же для питона зазеркалил классический крестовый map, который на основе red-black tree. Это мне было нужно для обучения нейросеток на колабе - там среда позволяет нормально компилировать сишные модули для Ру.
Ну я просто скопировал свой класс который в Qt проекте использовался.
Так буквально можно в несколько действий убрать всю связь с Qt.
Хороший тред.
Кстати кто знает как правильно патом спектр рисовать после преобразования fftw и перестановки местами двух половин.
Вопрос как правильно отрисовать "бины". Именно с визуальной точки зрения, если я рисую бин в виде прямоугольника, то левый край прямо угольника это начало бина, или оно в центре бина, или же правый край прямоугольника? Линия какого цвета соответствует началу бина? Я для себя выбрал левый край
На жоском аутизме делаются самые лучшие вещи. А потом уходят в продакшен и превращаются в говно для быдла.
Вообще похуй конечно, без аутирования тут не разберёшься глубоко, но есть риск заняться бесплодным изобретательством велосипедов (что немного видно в твоём случае) и фокусе на не имеющих смысла вещах (типа какие бары сделать ор). Тебе, видимо, скучно пиздец, что ты вопросы придумываешь.
Попробуй вейвлеты покопать интереса ради, если спектральные представления сигналов интересны. Базис фурьешный идеально локализован в пространстве частот, но совершенно не локализован во времени. Есть компромисс между этими крайними случаями, позволяющий локальную во времени информацию пощупать. Вейвлеты и банки фильтров брат.
Почему ты называешь меня братом? Вейвлеты та же хня, там просто быстрее получаешь инфу о сигнале, но сложнее ее превратить в выходной сигнал. Почему ты называешь меня братом?
>>016452
Аноны, поясните по самому сигналу. Если взять например скрипку, какую нибудь ноту, и вырезать из неё милипиздрическую часть, прокатить оконную функцию, сделать преобразования фурье, посчитать пики (столкбики), то вот эти столбики после того как станут на определённые уровни, больше не будут прыгать. А если например взять звук лягушки - ква, продолжительностью 1 секунду, то мы разрезаем этот звук на куски по 0,1 секунды, для каждого куска прогоняем оконную функцию, для каждого куска делаем преобразование фурье, для каждого преобразования считаем пики и в итоге когда идёт проигрывание звука ква, то наши пики пляшут, правильно ли я понимаю? Так же вопрос, что относительно пиков представляет собой удар в барабан в песни? Все частоты (пики) одновременно подпрыгивают?
Возьми за щеку, шиз семёнящий.
Ну нет, столбики на нотах скаканут только в определённом диапазоне частот, не которые останутся на местах. Возможно удар в барабан должен низкие частоты сильно поднять, патом когда удар стихнет, столбики низких частот тоже в низ опустятся. Модешь за эталон взять приложение на андроид Spectroid, поднести к микрофону телефона интересующий тебя звук и посмотреть как будет выглядеть спектр интересующего тебя звука. Правда там не по столбикам, а просто не прерывная линия, но всё равно будет наглядно.
А получается что если свет волна, то например свет от фонаря на улице можно таким же преобразованием фурье на радугу разложить? То есть узнать, сколько будет в свете красного, жёлтого, фиолетового, глядя на пики после преобразования?
А как работает этот Спектроид? Вот например кто то говорит, он вырезает из речи последний отрывок длинной 0,1 секунду, бесконечно зацикливает его и обрабатывает? Тогда получается что он и любой визуализатор запаздывает в своей визуализации на эту 0,1 секунду?
Да можно.
>>016830
Да он всегда немного в прошлом. АЦП преобразовывает аналоговый звук в дискретный сигнал. Патом ты в реал тайме берёшь копишь данные с АЦП пока не накопишь на одно преобразование фурье. Делаешь преобразование фурье, и видишь сколько мощностей на тех или иных частотах было за то время пока ты копил данные с АЦП.
Допустим АЦП измеряет напряжение на микрофоне с частотой 48000 Гц. То есть на одно измерение АЦП уходит 0.0000208 секунды или 20.8 микросекунд. Ты решил что тебе будет достаточно 2048 отчётов для преобразования Фурье. То есть каждые 0.042 секунды, или 42 миллисекунд ты будешь накапливать 2048 отчётов и делать из них спектр. Запаздывать ты будешь как раз таки в данном случае на 42 миллисекунды.
Насчёт бесконечно зацикливает, это что то лишнее ты приплёл.
> Насчёт бесконечно зацикливает, это что то лишнее ты приплёл.
Вот же пик, там анон выделяет из сигнала кусок, потом сглаживает края и склеивает в длинную простыню, и на неё делает преобразование Фурье, почему он кстати не мог просто сделать на вот этот кусочек преобразование и не лупить его? Или вообще сделать на изначальный сигнал?
Я конечно не мастер цифровой обработки сигналов, но мне сказали старшие товарищи что бы сигнал выглядел нормально, нужно пропускать через оконные функции так как при каждом отчёте накопленном, фазы у накопленных снимков сигнала будут разные, и тогда спектр будет не нормальную информацию показывать.
>>016862
>Допустим АЦП измеряет напряжение на микрофоне с частотой 48000 Гц. То есть на одно измерение АЦП уходит 0.0000208 секунды или 20.8 микросекунд. Ты решил что тебе будет достаточно 2048 отчётов для преобразования Фурье. То есть каждые 0.042 секунды, или 42 миллисекунд ты будешь накапливать 2048 отчётов.
Представь что АЦП раз в 20.8 микросекунд тебе даёт цифру в виде напряжения на микрофоне в этот момент времени. Ты каждые 20.8 микросекунд считываешь эту цифру и складываешь в массив из 2048 элементов. Когда заполнишь весь массив делаешь преобразование фурье над этим массивом. И патом заново с 0 начинаешь копить.
Эта задержка называется latency. Тебе звуковой драйвер всегда отдает сигнал блоками. Во многиз звуковых программах (DAW - Digital Audio Workstation) есть такая настройка в конфиге.
Сложность (нагрузка на проц) БПФ - логарифмичекская O(log(N)), поэтому выгоднее обрабатывать сигнал блоками побольше. При этом будет и разрешение по частоте выше, это плюс, но увеличится латентность, это минус.
>>016867
Преобразование Фурье это сумма синусов с разными частотами, амплитудами и фазами. Преобразование ты делаешь на одном блоке сигнала, я блоки красными линиями разделил, но если ты потом сложишь эти синусы, то у тебя получится как раз такой бесконечный сигнал. Спектр у такой "пилы" будет не очень информативный, поэтому накладывают оконную функцию. Если делают свертку сигналов (например, ты срисовал микрофоном импульсную характеристику помещения и накладываешь ее на какой-то сигнал, то есть делаешь реверберацию), то оконная функция конечно не нужна.
Мне говорили кстати говорили старшие товарищи что есть пределы увеличения размера fft, дальше нет смысла его увеличивать ради точности. Точность особо не вырастет, надо также и частоту дискретизации учитывать и увеличивать.
Оно еще к тому же внутри выполняется слоями, поэтому слишком большое преобразование накопит ошибку. В ряде применений подразумевается еще и обратное преобразование потом, то есть плюс еще ошибка.
Передискретизация оно же oversampling, хорошо делается на звуке кубической интерполяцией, но у меня в принципе и линейная нормально работала. Конкретно был кейс, когда эмулировал гитарную педаль. Она, если по простому, обрезает сигнал на некотором уровне, а что осталось, усиливает раз в 100. При таком усилении шум дискретизации и шум квантования (16 бит) были прямо слышны. 8x частота с линейной интерполяцией и переквантование в 32 бита решили вопрос.
Так если драйвер инфу блоками отдаёт, то зачем копить отдельно в массив эту дату? По сути предлагается брать этот блок и поэлементно из него перенести данные в наш массив (2024 длинны)? Можно же просто преобразование Фурье на этот блок применить?
Классическое БПФ выполняется на массивах размером степени двойки. Я сталкивался с тем, что в WINAPI (win32) функции waveIn нормально отдают блоки по 480 семплов на частоте 48kHz, а если попробовать 512, то всё начинает "заикаться". Да, libfftw может придумать "план" для разных размеров массива, но это может обернуться непредсказуемой ошибкой. Дальше, входной сигнал вообще-то комплексный с нулевой мнимой частью. Это если ты хочешь, чтобы каждый слой БПФ отрабатывал строго по одному алгоритму. Хотя, с другой стороны, это предмет для оптимизации и libfftw кушает на входе просто действительный сигнал. Дальше, libfftw опять это инкапсулирует в себе, но вообще-то есть такая штука как "прореживание", такая специальная перестановка, и оно может быть на входе либо на выходе. Вот три возможных причины переносить в свой массив сигнал на входе - расширить массив до степени двойки, дополнить числа нулями до комплексных, выполнить прореживание на входе.
В моём алгоритме, в функции addIQ можно кормить отчётам не кратно степени двойки
> по 480 семплов на частоте 48kHz,
Можешь пожалуйста подробно написать что это значит? Что такое семпл? Это значение с которой должны рыгнуть колнка? Что из себя вообще представляет блок данных, который отдаёт драйвер? Это просто массив чисел, или структур? Что вообще это такое то
Начать надо с того, что лучше всего использовать драйвер ASIO. Такой драйвер отдает нормально массивы любого размера. Семпл - это просто один отсчет сигнала. Напряжение с микрофона в текущий момент времени, умноженное на какой-то коэффициент. Это число, у драйвера ASIO может быть float, у функций waveIn, боюсь соврать, вроде int. Если стерео или больше каналов, то оно с интерливингом, то есть с чередованием. Соответственно при частоте дискретизации или она же частота семплирования 48 килогерц для моно сигнала 480 семплов будут представлять собой фрагмент сигнала длительностью ровно одну сотую секунды. Это просто массив из 480 float'ов или int'ов, смотря что за драйвер и как у него попросишь отдавать сигнал.
спасииибоо
А вот на пикриле я сделал имитацию сигнала уже в виде суммы трёх тригонометрических функций. Вот вопрос вот в чём, правильно ли я понимаю, что на спектре будет три значения? Если да то какие именно значения у графика спектров будут по осям x и у? То есть что откладываем по x и что по y?
По X частота, по Y спектральная мощность. Спектр трёх функций даст тебе мощность на частотах этих функций. Для одного синуса вся мощность сигнала будет сосредоточена в одной частоте, и будет только одна палочка на спектре, все остальные частоты будут в 0.
Для двух синусов две палочки две палочки будут иметь значение, другие частоты(палочки) будут в 0.
> Для двух синусов две палочки две палочки будут иметь значение
ну вот если взять функцию 3sin(x2 / 4), то где будет отложена палочка по оси X и на какую высоту она подымется по оси Y?
У тебя там в косинусе икс аж в кубе. У этой штуки сложный спектр будет. Если бы просто были три синуса с разной амплитудой, периодом и фазой, то на амплитудном спектре это три полоски. На самом деле скорее три "горки". Одиночные прям резкие пики могут быть только у синусов, укладывающихся ровно целое число раз в твой массив сигнала. По иксу откладывается частота. По игреку амплитуда. Там еще есть момент, что это может быть не амплитуда, а мощность, то есть БПФ по разному немного считать можно, будет спектр мощности. Мощность это квадрат амплитуды. Частоты - от нуля - до половины частоты дискретизации, например 24кГц., а дальше амплитудные спектр симметричен относительно этой частоты, а фаза симметрична со знаком минус, то есть на выходе БПФ на самом деле половина избыточной информации.
> У этой штуки сложный спектр будет
Правильно ли я понимаю что в ряде Фурье не может быть синусоид у которых аргумент x не в первой степени, если такие попадаются, то они в свою очередь будут разложены на более простые функции? то есть функция sin(x2) будет представлена в спектре несколькими функциями?
Синусы (от аргумента в первой степени) - ортогональная система. То есть их суммой (или интегралом для непрерывного случая) можно представить вообще любую функцию, единственно что без разрывов и бесконечностей. Да, sin(x2) будет представлен целой кучей синусов.
Что здесь происходит?
Скуфы из НИИ учатся математике чтобы строить орудия убийства украинцев?
это типа спектр sin(x2)
Просто в ньюфаг-треде один анон пояснил другому, как информативно раскладывать сигнал на амплитуды сверток с другими функциями.
1280x720, 0:47
То что происходит внизу называется водопад. Это интенсивность цвета во времени. Если бы верхний спектр был в 3д, и у него была бы толщина. То если бы мы на него сверху посмотрели то увидели бы интенсивность цвета на каждой частоте. И вот такие снимки сверху каждый кадр делаются и формируется картинка водопада. Зачем он нужен? Ну я конечно анализом спектров не занимаюсь, но те кто занимаются всегда пользуются водопадами. С помощью них можно оценить во времени что происходило в частотной области. Какой то опытный знающий радио инженер посмотрит на водопад, и такой, ага вот на частоте радиостанция с AM модуляцией.
Вообщем это снимки верхнего спектра каждый кадр которые объединяются в одном изображение
Хочу сигнал обработать - обработаю у тебя на глазах и ничего ты мне не сделаешь, трястись в сторонке будешь пока я синусоиды кручу и спектр мучу на спинах твоих отцов.
Нахуй я это делаю? Могу себе позволить, и позволю, и тебе по губам косинусом кожаным проведу.
Что сложного?
А мне нравится как он отвечает.
Тема интересная. Но на доске овер 90% это макаки и вкатуны. Такой себе "человеческий материал". Это тема для белых людей из https://2ch.hk/ra/ (М) - там смогут понять и оценить. А серезьёзные вещи обсуждать среди дрочеров - это бесперсктивно. Если хотя бы один ввкатится в ЦОС, считай что ОП победил.
Что непонятного ?
https://simple.wikipedia.org/wiki/Fourier_transform
Шиз больше нагоняет важности на себя, тогда как по сути, это рядовой и даже бытовой вопрос математики.
я не понимаю, зачем оно вообще нужно.
недавно озадачился покупкой осциллографа, читаю обзоры на eevblog.com, а там в каждом топике срач "у этого осла FFT хуйня, вот у моего осла FFT ого-го, а у твоего - фи"
я правильно понимаю, что это нужно только для сложных сигналов типа звука, а для простой электроники с постоянными частотами никакие разложения нах не нужны?
Это просто разложение сложного сигнала на простейшие составляющие - косинусы и синусы, и у каждой составляющей какой-то вес. Позволяет проще выполнять математические операции над сигналом.
> > я правильно понимаю, что это нужно только для сложных сигналов типа звука, а для простой электроники с постоянными частотами никакие разложения нах не нужны?
то есть это надо для каких-нибудь фильтраций шумов, усилений слабых сигналов, и так далее, а рядовому ардуинщику с простыми 32кгц кристаллами никакое разложение нахуй не надо?
Ну если рядовой ардуинщик не работает с обработкой сигналов (исключая стандартный АЦП/ЦАП в комплекте) - это понятное дело не надо.
Другое дело что тема достаточно интересная, если не упарываться математическими формулировками
Прикинь сижу я значить дома мамкин борщ хуярю, а с улицы меня сигналом облучают. Сигнал во времени вроде как конечный, и мощность в нем конечная без разрывов. Я возьму вот >>051068 и разложу сигнал-то, разложенным сигналом ты попробуй ещё облучи кого. Его же надо собрать обратно. Туда ещё можно, а обратно никак. Сумма синусоид она ж большая границ-то нет они же бесконечные. Кто ещё шиз тут ишь чо ух бля.
Нет, все-таки таблетки ты лучше пей
Если вкратце, то бэйзлайн моделится взвешенной регрессией P-сплайнов, и каждую иттерацию веса пересчитываются, моделя сигнал как 2 компоненты - случайный шум - нормальное распределение с какими-то сигмой и мю + равномерное распределение для регионов где сигнал есть. Ну и типа получается, что если шум сплайном сгладить, то среднее - как раз бэйзлйан.
В статье предлагают взять какой-то инишиал гэс по весам и по параметрам (сделал как в статье), и в каждой итерации делать ЕМ.
Беру как априорную вероятность 0.5, домножаю его на плотность вероятности гаусовское расределение с сигмой, мю, в точках текущих остатков (Сигнал - бэйзлайн). Получаю постериорное как posterior = gaus / (gaus + (1 - prior) * unif)
И далее апдейчу параметры... и...
Как апдейтнуть новую вероятность принадлежности к региону сигнала с сигмой я хз. Беру как prior, sigma = mean(posterior), std(res[posterior >= 0.5]). Результат калистый, плохо аппроксимируется. У кореша норм. Спросить не могу, потому что буду казаться лохом. Пусть лучше буду казаться лохом здесь.
Поясни конкретнее, мало что понятно. У тебя спектр чего-то с пиками, позиция и интенсивность которых имеет физический смысл? Почему нельзя включить фон в модель? Покажи пример, что ли. Пробовал fityk.nieto.pl использовать для анализа спектров своих?
Ананасик мой любименький, вот скажи мне как брат брату, ну вот разложил я сигнал на отрезке 1...2сек на пики частот по мощностям. А вот если я хочу как в винампе аквалайзеры прикрутить, это что мне надо делать? Это мне эти сами пики как-то надо делить(умножать), и обратно из преобразованного графика выстраивать первоначальную звуковую волну и отдавать на звуковой драйвер? Просвяти плиз бибизьяна
Ну тут мои знания заканчиваются. Могу сказать только следующие вещи:
В принципе можно получившийся набор частот воспринимать как ползунки эквалайзера, и добавлять и прибавлять к ним нужное количество мощности. Затем проводить обратное преобразование фурье и получать сигнал. Но это чревато искажениями сигнала. И как мне сказали старшие товарищи, это не круто.
Можно генерировать специальные фильтры низких частот, которые будут одни частоты выделять, другие гасить. Но тут уже без преобразования фурье можно обойтись. Ты один раз генерируешь нужный тебе фильтр, а затем подмешиваешь его в сигнал. Это самый правильный вариант, но я в этом не шарю совсем.
Вообщем либо вручную в получившиеся столбики частот добавлять/убавлять мощность, но мириться с искажениями звука.
Либо вообще не использовать преобразование фурье и просто подмешивать в сигнал другой сигнал, который как эквалайзер изменит твою частотную характеристику.
Я помню хотел выделить из звука определённый набор частот и воспроизвести его, я делал так: сделал преобразование фурье, мощности ненужных частот приравнял к нулю, нужные частоты не трогал. Сделал обратное преобразование фурье, воспроизвёл получившийся звук. (На двух картинках визуализация) Вроде работало, но мне старшие товарищи сказали, что это не серьёзно и так никто не делает.
Вот и всё что я могу тебе сказать
> Но если на вход мы подаём просто набор рандомных точек, то что будет? Кто нибудь пробовал применять разложения сигнала на спектр который имеет искусственную природу?
Белый/розовый/лазурный шум. Цвет дают по распределению частот в шуме. Использовали для всяких спецэффектов, имитация голоса иои дождя, всякое такое.
Если такое правило, что чем короче сигнал во времени, тем шире его спектр. Соответственно предельно короткий сигнал (точка) произведет предельно широкий спектр.
1280x604, 0:17
Анончик, спасибо тебе большое, благодаря тебе я сделал первый шаг в этом удивительном и полном опасностей и приключений мире!
Анончик, ананасик, пожалуйста помоги. Что же мне делать, вот на видосе выше который я прислал там плавная анимация потому что звук идёт с микрофона, при попытке же визуализировать аудиофайл присходит жопа!!!! Драйвер отдаёт семпл буфер длинной 0.371 секунды! И получается что вот эти прыгунки прыгают с фризами! Что же делать, как добиться плавной анимации как у тебя? Хуже всего то что пики ударных смогут не попадать в указанный рейт и получатся пропуски ударных на анимации.
Ананасик, ещё вот пишет что в этом буффере длинной 0.371 секунды содержится 16384 семплов. Это похоже на правду? Что такое один семпл то? Это как раз один всплеск синусоиды и есть этот сэмпл?
Сэмпл - это 1 замер значения твоей непрерывной синусоиды. Чем чаще ты делаешь замеры, тем точнее ты описываешь свою синусоиду, это называется дискретизация
Соответственно 16384 * 1 / 0.371 = 44161.7 сэмлов в секунду, т.е. у тебя волна с частотой дискретизации 44.1 khz, похоже на правду, это распространенное значение
Для работы на оборонку надо.
Детектить сигналы хочу.
Как мне подобрать параметры чтобы morlet выглядел красиво?
>>152686
>Драйвер отдаёт семпл буфер длинной 0.371 секунды!
Так не должно быть в реалтаймном приложении. Должен быть буфер порядка одной сотой секунды, а не такой огромный.
>>154963
>khz
Килогерцы.
>>154981
С железками все интереснее. На динамик вообще может идти Pulse Width Modulation, чтобы выходной транзистор был или полностью открытый или полностью закрытый, то есть не грелся.
Это анимация амплитуды спектра, то есть sqrt(re^2 + im^2). Для каждого буфера считаешь амплитуду и у тебя есть в отдельном массиве накопленная амплитуда. Делаешь как-то так integral_amlp[ i ] = 0.9 integral_amlp[ i ] + 0.1 current_ampl[ i ], и показываешь integral_ampl, когда у монитора обратный ход развертки условных 60 раз в секунду. Буферы поступают с одним интервалом, а показываешь с другим.
Это твоя анимация? Разьясни пож вот эту формулу sqrt(re^2 + im^2), чем амплитуда спектра отличается от спектра?
Не моя, но я такое делал. Спектр - массив комплексных чисел. Комплексное число можно представить в виде амплитуды и фазы. Вот амплитуда это и есть то, что показывается.
0.9 integral_amlp[ i ] + 0.1 current_ampl[ i ]
да нет бред какой-то, у нас не будет ярких пиков в момент ударных или жёстких синтов, думаю там грубо говоря так сделано - у нас сразу в память считаются все семплы композиции - создаётся массив из 100500 семплов, и у нас есть окно которое едет по этому массиву, как каретка, каждый фрейм сдвигается немного вправо и выдаёт новое значение спектра которое и отображается юзеру
Можешь наращивать амплитуду сразу, и только отпускать по ФНЧ, так во многих DAW сделано.
>у нас есть окно которое едет по этому массиву
У тебя на пике непрерывное преобразование. Есть формула для пересчета уже готового с учетом нового поступившего отсчета, но это очень медленно будет, проц не потянет.
> У тебя на пике непрерывное преобразование
Не понял, какая разница, и там и там массив семплов, ты предлагаешь массив семплов длинной 0,01 секунды, пусть там будет 100 семплов, и ширину окна можно сделать чтобы влезало 100 семплов, и над этими 100 семплами в обоих случаях мы делаем преобразование Фурье
На каждый семпл все 100 пересчитываются по формуле - сложность N2, пока у бпф NlogN. А если ты будешь бпф-ом считать, а не пересчетом, то получится вообще сложность N2logN. Проц не потянет это.
Блять пиздец ты сложно пишешь, я же не знаю что такое бпф, и вообще не понял струткуру этого предложения, что за пока у бпф NlogN?
Если просто, то имеет смысл никогда повторно не пересчитывать преобразования для одних и тех же фрагментов сигнала. То есть окно не скользящее, а шагающее и без пересечений должно быть, иначе для проца очень тяжело.
Ты чё, ты чёё. У нас же напрямую спектр зависит от положения окна
Если выбрать супер маленькую ширину окна, то почему должно помереть то, опять таки не вижу разницы для проца, и в том и в том случае он считает буфер шириной 100 семплов
Ебать, этот тред ещё жив. На этом >>031176 спектре частота дискретизации 48000, а устройство отдающее мне IQ отчёты отдаёт посылками по 256 отчётов, то есть каждые 5 миллисекунд. Отчёты я коплю до 2048 отчётов, а затем делаю над ними FFT. У меня там скользящее среднее, то есть я беру 5 успешно созданных FFT, нахожу их среднее арифметическое, и отрисовываю. Когда создаётся новое FFT, я самоё старое FFT из этих 5 перезаписываю новым и снова нахожу среднее арифметическое и отрисовываю. То есть у меня всегда существует 5 массивов FFT. На картинке как бы показана история массивов FFT и как я из них выбираю какие будут попадать в отрисовку.
Мимо другое шизло, интересно видеть, как тред всплывает. Какие ещё параметры подобрать, что значит красиво выглядеть?
С практических позиций, если хочешь сигналы детектить, попробуй с dtcwt разобраться, спектр вроде как почти не меняется по форме если сигнал двигается во времени. У обычного dwt проблема с инвариантностью спектра относительно сдвига по времени, поэтому вряд ли ты что-то полезное с морлетом вытащить сможешь.
Обычный фурье образ хуй кладёт на сдвиг, но и информацию ты теряешь о том, где в сигнале что-то интересное происходит. Шиз местный думает, что вейвлеты та же хуйня что и оконное фурье, поэтому скорее всего и пояснить не может.
В октаве есть пакет LTFAT, либо на питоне с таким же названием, если матлаба нет.
>Мимо другое шизло, интересно видеть, как тред всплывает. Какие ещё параметры подобрать, что значит красиво выглядеть?
А вот так вот. Лучше формулировки не нашлось.
Я собираюсь на картинках обучать нейросеть путем transfer learning.
Идея в том, что чем больше картинки похожи на объекты, которые видел и классифицировал человек, тем больше эта нейросеть найдет различий в в картинках и значит в исходных сигналах. Жалко что оно не рисует лошадок и кошечек, но некие пятна Рошарха меня бы устроили
пока какая-то хуйня рисуется и считается, но у меня и данных весьма мало. Я на глаз нихуя не могу увидеть.
Картинки вроде разные. Но чем разные - хз.
Это и есть реальные сценарии. А зачем это шизло объясняет самому себе какую-то хуйню - непонятно.
Анончик, благодарю тебя! А вот мне никак не получить буффер меньше 16000 семплов, я его визуализировал и вот такую шнягу я увидел!!! Это блять что такое - стереосигнал? У тебя тоже стереосигнал и ты на него забил? Или это чистить надо до моно сигнала?
Ничо не понял, но задача нетривиальная похоже. Лучше смотреть в сторону эмбеддингов для картинок, чем на вейвлеты, и попробовать уже на них модель строить. Если данных мало, никто не мешает малые вариации внести в картинки.
Вейвлеты не факт что вообще помогут тебе тут. Непонятно, дискретное преобразование ты пытаешься делать или непрерывное, чем и где, и о каких параметрах говоришь. Если ты хочешь вырезать шум, сделать акцент на деталях, убрать усредненный фон, имея возможность делать это на нескольких уровнях - тогда вперёд. Вейвлеты, если простым языком, это локальные средние и локальные разницы, где среднее на текущем разрешении разлагается на последующем. Может быть полезным для экстракции фич, базара ноль. В своей работе я в табличных данных погряз, не трогаю картинки и мало что знаю о нейросетях современных. Но как я понимаю стандарт индустрии сейчас - эмбеддинги, а не вейвлеты. Сейчас не восьмидесятые.
>Но как я понимаю стандарт индустрии сейчас - эмбеддинги, а не вейвлеты. Сейчас не восьмидесятые.
Все так, но у меня маловато исходных данных.
В этом случае стандартом является моя схема.
А, кажется я неудачно описал.
Исходные данные - это типичные сигналы, но их мало и я собираюсь делать из них картинки. А потом уже это вот все
Тогда могу dtcwt посоветовать и со спектра фичи вытаскивать по уровням, тут хороший гайд:
https://www.mathworks.com/help/wavelet/ug/dual-tree-complex-wavelet-transforms.html
Нафиг тебе морлеты не нужны
я не знаю что тебе ответить. У меня моно сигнал.
Держи тред в тонусе.
Единственная проблема в том, что 99,9% вакансий на эту тему будет связано с ВПК. Пацифисту будет больно этим заниматься.
>мощности ненужных частот приравнял к нулю, нужные частоты не трогал. Сделал обратное преобразование фурье, воспроизвёл получившийся звук. (На двух картинках визуализация) Вроде работало, но мне старшие товарищи сказали, что это не серьёзно и так никто не делает.
А как делают?
Оконная функция применяется только 1 раз, к каждому входящему фрагменту, или ещё и на выходе нужно, после fft? Если да, то это одна и та же должна быть функция, или видоизменённая?
Зачем второй раз? я вообще не особо понимаю нахрен она нужна? То есть без неё просто будет каждый некий всплеск раз когда подгружается новый чанк? Например в композиции момент когда скрипка тянет одну ноту, но тут приходит с драйвера следующий чанк и на визуализации мы видим мусорный всплеск? Вот кстати на втором графике показана как она выглядит
В этой статье, например, на рисунке показано, что окно применяется перед оконечным сумматором. [См. изображение].
А в этой статье применяются уже в 2 местах - и в начале, и в конце.
Также встречаются материалы и с обработкой окном в начале.
Можно генерировать специальные фильтры низких частот, которые будут одни частоты выделять, другие гасить. Но тут уже без преобразования фурье можно обойтись. Ты один раз генерируешь нужный тебе фильтр, а затем подмешиваешь его в сигнал. Это самый правильный вариант, но я в этом не шарю совсем.
Артаваздович в треде? Я тебе колеса спущу
На вход я подаю массив на пикриле
Почему значения амплитуды колеблются от примерно -6 до 6?
На оригинальном семпл буфере значения от -1 до 1
640x360, 2:44
Алсо, смотрите, ананасики, что получается, всё равно конечно результат колбасит, не получается так же плавно как в винампе. Почему? Наверно как раз из за того что фаза начинается не с 0, для этого и нужна оконная функция. Буду проверять
640x384, 0:18
Короче оконная функция просто убирает мусорные всплески около нуля, но пики всё равно колбасит. И проц реально херачит. Бля почему же на винампе так плавно сделано, кто знает то