Генератор сигналов с визуализацией спектра

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

The trick
Постоялец
Постоялец
 
Сообщения: 599
Зарегистрирован: 26.06.2010 (Сб) 23:08

Генератор сигналов с визуализацией спектра

Сообщение The trick » 12.02.2020 (Ср) 9:56

Всем привет!

В данном проекте реализован простой генератор нескольких звуковых сигналов с визуализацией их спектра. Список сигналов включает в себя:

  1. Белый шум;
  2. Розовый шум;
  3. Коричневый/красный шум;
  4. Синий шум;
  5. Фиолетовый шум;
  6. Синусоида с изменяющейся частотой;
  7. Прямоугольная волна (нечетные гармоники убывающие на 6db/oct);
  8. Пилообразная волна (все гармоники убывающие на 6db/oct);
  9. Треугольная волна (нечетные гармоники убывающие на 12db/oct);
  10. Сигнал только с четными гармониками;
  11. Сложная частотная модуляция;
  12. Амплитудная модуляция;

Визуализатор спектра поддерживает разрешение до 32768 точек, а также усреднение спектра по нескольким выборкам. Визуализатор оформлен в виде отдельного контрола и может быть использован в других проектах. Для визуализации спектра применяется быстрое преобразование Фурье (FFT). Данная процедура оптимизирована для обработки реального сигнала так что за раз обрабатывается сразу 2 реальных сигнала которые затем преобразуются в 2 спектра декомпозицией на основе сигналов с четной и нечетной симметрией. Дальнейший синтез единого спектра из двух основан на сдвиге во временной области и соответствующих поворотах в частотной. Комментарии в коде подробно описывают процесс.

spectrum.png


Спасибо за внимание!
The trick.
У вас нет доступа для просмотра вложений в этом сообщении.
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3958
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Генератор сигналов с визуализацией спектра

Сообщение Mikle » 12.02.2020 (Ср) 10:29

Проект при загрузке жалуется на отсутствие comctl32.ocx, хотя такая библиотека в System32 имеется, её регистрация не помогла. Однако, если ошибку игнорировать, то проет загружается и работает, может просто чего-то не хватает? Выглядит как на скриншоте.
На шумовых сигналах весь график спектра хаотично движется вверх-вниз, что выглядит нереально - это бы соответствовало такому же изменению громкости всего спектра частот.

The trick
Постоялец
Постоялец
 
Сообщения: 599
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Генератор сигналов с визуализацией спектра

Сообщение The trick » 12.02.2020 (Ср) 10:47

На шумовых сигналах весь график спектра хаотично движется вверх-вниз, что выглядит нереально - это бы соответствовало такому же изменению громкости всего спектра частот.

Отображение спектра автоматически подстраивается по максимальному уровню сигнала, для уменьшения дрожания как раз и нужно усреднение. А спектр показывает относительную спектральную плотность, а не абсолютную.

Проект при загрузке жалуется на отсутствие comctl32.ocx, хотя такая библиотека в System32 имеется, её регистрация не помогла. Однако, если ошибку игнорировать, то проет загружается и работает, может просто чего-то не хватает?

Попробуй поменять версию на такую - Object={6B7E6392-850A-101B-AFC0-4210102A8DA7}#1.0#0; comctl32.Ocx
Она в принципе вообще не нужна, я просто забыл ее убрать оттуда.
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3958
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Генератор сигналов с визуализацией спектра

Сообщение Mikle » 12.02.2020 (Ср) 10:59

The trick писал(а):Попробуй поменять версию на такую

Сработало.
The trick писал(а):Отображение спектра автоматически подстраивается по максимальному уровню сигнала

Мне кажется это лишним, или, как минимум, шкала децибелов слева тоже должна двигаться. Конкретные децибелы соответствуют вполне определённым вольтам на линейном выходе.

The trick
Постоялец
Постоялец
 
Сообщения: 599
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Генератор сигналов с визуализацией спектра

Сообщение The trick » 12.02.2020 (Ср) 11:15

Мне кажется это лишним, или, как минимум, шкала децибелов слева тоже должна двигаться. Конкретные децибелы соответствуют вполне определённым вольтам на линейном выходе.

Представь белый шум - он имеет равномерную спектральную плотность на всех частотах. Если мы имеем дело с аналоговым сигналом с бесконечным спектром то там амплитуда каждой гармоники стремится к 0, но вклад всех гармоник дает сигнал определенной амплитуды. Для дискретного преобразования в данном случае спектральная плотность равномерно распределяется между отсчетами в частотной области, т.е. мы работаем не с одной гармоникой а группой но все равно - величина спектральной плотности зависит от разрешения. Т.е. если мы берем ДПФ от 16 отсчетов то белый шум равномерно распределится между этими 16 отсчетами и величина каждого будет приблизительно 1/16. Если же мы возьмем ДПФ от 32768 то амплитуда каждого будет 1/32768. Можно подумать что возможно просто нормализовать по количеству отсчетов, но это не подойдет и вот почему.
Сравни 2 сигнала - шум с амплитудой 1 В и синусоиду с амплитудой 1 В. В первом случае гармоники распределены по всей частотной области, во втором только в одном месте. Если делать нормировку по количеству отчетов, то в первом случае мы получим сигнал с очень маленькой амплитудой на каждой частоте, что соответствует истине, но не подходит для визуализации, а синусоида будет соответствовать 0 Дб (если смотреть относительно уровня 1В). Поэтому я выбрал усреднение по пиковому значению, поскольку это показывает именно спектр сигнала независимо от его амплитуды.
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3958
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Генератор сигналов с визуализацией спектра

Сообщение Mikle » 12.02.2020 (Ср) 15:26

The trick писал(а):если мы берем ДПФ от 16 отсчетов то белый шум равномерно распределится между этими 16 отсчетами и величина каждого будет приблизительно 1/16

Не совсем. Распределение будет равномерным, если делить по логарифмической шкале, а по Фурье мы получаем деление по линейной шкале (помнится, этот вопрос возникал при написании кругового визуализатора спектра). Или эта проблема решена?
И уровень каждого отсчёта, если их сумма равна 1, будет, по идее, Sqr(1/16), шумы суммируются по такому закону. Речь о действующем, а не амплитудном, значении.

Но в целом мысль понял, действительно, у чистого, долгого синуса уровень будет стремиться к бесконечности, и с этим надо что-то делать. Может, просто давать графику уйти за верхний край окна? Ведь это будет только на очень узких полосах и при чистых, длительных (!) сигналах. Заметь, на синусе с качающейся частотой ширина полосы тем больше, чем быстрее движется опорная частота по шкале. И это не недостаток анализатора, а объективная реальность - у такого сигнала действительно такой спектр.

The trick
Постоялец
Постоялец
 
Сообщения: 599
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Генератор сигналов с визуализацией спектра

Сообщение The trick » 12.02.2020 (Ср) 17:02

Mikle писал(а):Не совсем. Распределение будет равномерным, если делить по логарифмической шкале, а по Фурье мы получаем деление по линейной шкале (помнится, этот вопрос возникал при написании кругового визуализатора спектра). Или эта проблема решена?

Так равномерное это и есть линейное, по крайней мере я это и подразумевал. В том анализаторе проблема была с разрешением, в данном анализаторе разрешение по частоте составляет 44100/32768 (максимальное) Гц.

Mikle писал(а):И уровень каждого отсчёта, если их сумма равна 1, будет, по идее, Sqr(1/16), шумы суммируются по такому закону. Речь о действующем, а не амплитудном, значении.

Ну ДПФ преобразует временной сигнал именно в амплитуды, который и характеризует спектральную плотность. Здесь следовало бы конечно отметить что имеется в виду спектральная плотность амплитуд, а не энергий, но это неважно в контексте вопроса т.к. не влияет на конечный результат (нормировку).

Mikle писал(а):Но в целом мысль понял, действительно, у чистого, долгого синуса уровень будет стремиться к бесконечности, и с этим надо что-то делать. Может, просто давать графику уйти за верхний край окна? Ведь это будет только на очень узких полосах и при чистых, длительных (!) сигналах. Заметь, на синусе с качающейся частотой ширина полосы тем больше, чем быстрее движется опорная частота по шкале. И это не недостаток анализатора, а объективная реальность - у такого сигнала действительно такой спектр.

Да ты можешь видеть в приложении когда частота изменяется то вместо пика мы видим горб т.к. на определенный временной диапазон попадают множество частот.
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3958
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Генератор сигналов с визуализацией спектра

Сообщение Mikle » 12.02.2020 (Ср) 17:16

The trick писал(а):ты можешь видеть в приложении когда частота изменяется то вместо пика мы видим горб т.к. на определенный временной диапазон попадают множество частот.

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

Прибавь ещё один тип сигнала:
Код: Выделить всё
Private Function Zummer() As Single
  Static d As Single
  Static p As Long

  p = p + 1
  If p > 10000 Then p = p - 20000

  If p > 0 Then
    Zummer = Sin(d)
    d = d + 0.05
    If d > PI Then d = d - PI * 2
  Else
    Zummer = 0
  End If
End Function

У такого сигнала частота не меняется, а спектр меняет ширину.

The trick
Постоялец
Постоялец
 
Сообщения: 599
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Генератор сигналов с визуализацией спектра

Сообщение The trick » 12.02.2020 (Ср) 18:16

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

Не пойму про что ты. Смотри. Спектр дискретного сигнала всегда периодический. При увеличении разрешения период будет увеличиваться и так до бесконечности. Когда сигнал бесконечен - это также периодический сигнал только с бесконечным периодом.
Ширина спектральной плотности зависит от того какой сигнал и как он ложится на сетку частот. Когда в реальной задаче мы берем сигнал, то мы берем его на каком-то интервале, а это обозначает что мы умножаем сигнал на функцию прямоугольного окна. Умножение во временной области соответствует свертке в частотной, в итоге вместо единичного пика (дельта функции) мы получаем спектр прямоугольного импульса (sinc), что и показывает твой пример - видно характерный спектр:
sinc.png

Для уменьшения боковых хвостов используются другие весовые окна, которые позволяют улучшить одни характеристики ухудшая другие. Я даже делал анимацию как-то:
sinc.gif

Видно что если частота сигнала попадает ровно в центральную точку спектрального отчета, то хвосты как раз попадают нулями в соседние отсчеты. Поэтому если частота точно соответствует частоте спектрального отсчета мы видим единичный пик (именно единичный, весь массив будет содержать нули, и только один ненулевое значение). В этом случае период гармонического сигнала соответствует окну, но т.к. спектр и сигнал периодический как раз и получается бесконечный сигнал.
Горб как раз и образуется из-за применения оконной функции (в моем случае Хэмминга). Если рассматривать систему как непрерывную то на отрезке где изменяется частота у нас и вправду прямоугольный импульс, но т.к. мы используем оконную функцию то она сворачивается с этим импульсом и получается горб. Если использовать какую-либо другую функцию можно изменить вид горба.
У вас нет доступа для просмотра вложений в этом сообщении.
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3958
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Генератор сигналов с визуализацией спектра

Сообщение Mikle » 12.02.2020 (Ср) 19:50

Я вообще не про дискретность сигнала. Само собой, что зазубренность графика на твоей картинке - следствие дискретности. Я совершенно о другом, о том, что для определения спектра сигнала нужна его история, представь, что частота дискретизации сигнала неограниченно большая, так же у тебя в фильтре число полос стремится к бесконечности, всё равно при появлении чистого синуса спектр сначала будет широким (рис. 2), потом будет сужаться (рис. 3), а в самый первый момент, который не успеешь заметить, он будет плоским (рис. 1). И все эти спектры не являются суммой спектров синуса и прямоугольного импульса. И это не недостаток метода измерения, это - объективная реальность. Если к передающей антенне подключить в какой-то момент синусоидальный сигнал, то фотоны, излучённые антенной в разные моменты времени, будут иметь частоты в соответствие с этой картиной.
У вас нет доступа для просмотра вложений в этом сообщении.

The trick
Постоялец
Постоялец
 
Сообщения: 599
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Генератор сигналов с визуализацией спектра

Сообщение The trick » 12.02.2020 (Ср) 20:02

Mikle писал(а):Я вообще не про дискретность сигнала. Само собой, что зазубренность графика на твоей картинке - следствие дискретности. Я совершенно о другом, о том, что для определения спектра сигнала нужна его история, представь, что частота дискретизации сигнала неограниченно большая, так же у тебя в фильтре число полос стремится к бесконечности, всё равно при появлении чистого синуса спектр сначала будет широким (рис. 2), потом будет сужаться (рис. 3), а в самый первый момент, который не успеешь заметить, он будет плоским (рис. 1). И все эти спектры не являются суммой спектров синуса и прямоугольного импульса. И это не недостаток метода измерения, это - объективная реальность. Если к передающей антенне подключить в какой-то момент синусоидальный сигнал, то фотоны, излучённые антенной в разные моменты времени, будут иметь частоты в соответствие с этой эту картиной.

Сигнал о котором ты говоришь уже не будет синусом, т.к. синус определен от минус бесконечности до плюс бесконечности. Во-вторых то о чем ты говоришь уже не является непрерывным спектром, т.к. это оконное преобразование поскольку есть моменты до и после. Т.е. как ты говоришь в первоначальный момент и потом - не применимо к непрерывному преобразованию, т.к. оно определено на отрезке от -∞ до +∞. Т.е. оно включает все моменты времени. Плоский спектр соответствует дельта импульсу - это будет тогда когда только единичный импульс будет в окне. Когда ты говоришь что в первоначальный момент мы будем видеть сначала одно уже обозначает то что ты ограничиваешь сигнал каким-то окном на котором ты измеряешь спектр. А соответственно ограничивание окном есть свертка с функцией окна.
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3958
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Генератор сигналов с визуализацией спектра

Сообщение Mikle » 13.02.2020 (Чт) 11:55

The trick писал(а):Сигнал о котором ты говоришь уже не будет синусом, т.к. синус определен от минус бесконечности до плюс бесконечности. Во-вторых то о чем ты говоришь уже не является непрерывным спектром

Я о том же, тут нет разногласий. Они были раньше, давай по пунктам, чтобы не погрязнуть, пока первое.
The trick писал(а):Так равномерное это и есть линейное, по крайней мере я это и подразумевал

Всегда считал, что равномерное - это по логарифмической шкале. Возможно, я ошибаюсь, но тогда получается, что белый шум, который по определению имеет одинаковый уровень спектра на всех частотах, содержит столько мощности в диапазоне от 20 до 40 Гц, сколько и в диапазоне от 15020 до 15040, что выглядит сомнительно.
Ещё по БШ - у тебя там довольно странная формула: (Rnd + Rnd + Rnd + Rnd + Rnd + Rnd) / 3 - 1. Почему не просто (Rnd - 0.5) * 2? Ведь распределение становится неравномерным.

The trick
Постоялец
Постоялец
 
Сообщения: 599
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Генератор сигналов с визуализацией спектра

Сообщение The trick » 13.02.2020 (Чт) 13:03

Всегда считал, что равномерное - это по логарифмической шкале. Возможно, я ошибаюсь, но тогда получается, что белый шум, который по определению имеет одинаковый уровень спектра на всех частотах, содержит столько мощности в диапазоне от 20 до 40 Гц, сколько и в диапазоне от 15020 до 15040, что выглядит сомнительно.

Так и есть. Мощность будет одинакова для белого шума на бесконечном промежутке времени.

Ещё по БШ - у тебя там довольно странная формула: (Rnd + Rnd + Rnd + Rnd + Rnd + Rnd) / 3 - 1. Почему не просто (Rnd - 0.5) * 2? Ведь распределение становится неравномерным.

Rnd генерирует с равномерным распределением, сладывая несколько значений мы приближаемся к нормальному распределению по центральной предельной теореме.
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3958
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Генератор сигналов с визуализацией спектра

Сообщение Mikle » 16.02.2020 (Вс) 19:56

Белый шум по определению должен иметь ровную характеристику, у тебя она немного возрастает, но виноват не сам шум, не реализация FFT, а усреднение по максимумам в визуализаторе.
Я заменил в процедуре Refresh эти строки:
Код: Выделить всё
        fValue = m_fSpecBuffer(lIndex)
        '// Get maximum between frequencies
        Do While lPrevIndex <= lIndex

            If m_fSpecBuffer(lPrevIndex) > fValue Then
                fValue = m_fSpecBuffer(lPrevIndex)
            End If

            lPrevIndex = lPrevIndex + 1

        Loop

на эти:
Код: Выделить всё
        If lIndex > lPrevIndex Then
          fValue = m_fSpecBuffer(lIndex)
          For i = lPrevIndex + 1 To lIndex - 1
            fValue = fValue + m_fSpecBuffer(i)
          Next i
          fValue = fValue / (lIndex - lPrevIndex)
          lPrevIndex = lIndex
        Else
          fValue = m_fSpecBuffer(lIndex)
        End If

Стало ровно, хочу ещё убрать этот автоуровень, из-за которого весь график плавает вверх-вниз, пока не разобрался где.
Нашёл баг - посмотри на поведение сигнала Frequency Modulation в разрешении 32768. Не пойму, откуда такое берётся, боюсь проблема в реализации самого FFT, там мне сложнее разобраться.

The trick
Постоялец
Постоялец
 
Сообщения: 599
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Генератор сигналов с визуализацией спектра

Сообщение The trick » 17.02.2020 (Пн) 16:44

Стало ровно, хочу ещё убрать этот автоуровень, из-за которого весь график плавает вверх-вниз, пока не разобрался где.

Переменная m_fPeak хранит текущий усредненный пик.

Я заменил в процедуре Refresh эти строки:

Спасибо, посмотрю.

Нашёл баг - посмотри на поведение сигнала Frequency Modulation в разрешении 32768. Не пойму, откуда такое берётся, боюсь проблема в реализации самого FFT, там мне сложнее разобраться.

Не пойму в чем баг. У меня вроде все нормально отображается.
UA6527P

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3958
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Генератор сигналов с визуализацией спектра

Сообщение Mikle » 17.02.2020 (Пн) 19:31

The trick писал(а):Не пойму в чем баг. У меня вроде все нормально отображается.

У меня на 32768 и не так явно на 16384 так, на более низких частотах ничего подобного:
У вас нет доступа для просмотра вложений в этом сообщении.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 3958
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Генератор сигналов с визуализацией спектра

Сообщение Mikle » 18.02.2020 (Вт) 14:16

The trick писал(а):Переменная m_fPeak хранит текущий усредненный пик.

Отлично. Я заменил эту строку:
Код: Выделить всё
fValue = fValue / m_fPeak

на такую:
Код: Выделить всё
fValue = fValue * Sqr(m_lResolution)

Теперь уровень никуда не плывёт, осталось шкалу слева растянуть децибел на 90, и будет то, что надо.


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 2

    TopList  
cron