На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование звука"
0) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с записью, обработкой, воспроизведением звука. Перед созданием темы подумайте, не будет ли она уместнее в разделах Разработка и тестирование программ, Наши исходники, а особенно Разовые заказы и подработки
1) На Раздел распространяются все Правила форума.Огромная просьба с ними внимательно ознакомиться.
2) Запрещается давать бессмысленные ответы вроде: "Снеси Мастдай", "ХП рулит", "Поставь Линукс" и т.д.
3) Запрещается создавать темы, в которых Вы намереваетесь получить ссылку на кряки, серийники и т.п. Также запрещено любое обсуждение p2p (peer-to-peer) сетей (BitTorrent, eDonkey и т.д.).
4) Реклама всякого рода пресекается беспощадно.
5) Используйте тэг [CODE] для выделения кода программы (непременно с указанием языка программирования - выбрать из списка. В противном случае бессмысленно!). Уважайте тех, кто будет читать ваш код!
6) Если решение вашей проблемы найдено, то не забываем помечать тему специальной функцией "Вопрос решён". Вам всего лишь требуется при написании последнего ответа поставить одну единственную галочку прямо над формой ответа.
7) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе

8) Если не прикрепляются/не скачиваются файлы, читаем Не прикрепляется / не скачивается файл. Любые обсуждения в данном разделе проблем с приложением файлов считаются оффтопиком! Со всеми вытекающими.

9) NEW! Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно. Попытки накрутки количества тематических сообщений за счёт поднятия древних неактуальных тем ("некрофилия") будут наказываться по велению левой пятки модераторского состава (см. пп.12, 13 Правил)



Нарушение Правил может повлечь наказание со стороны модераторов.



user posted imageFAQ Раздела user posted imageПоиск в Разделе user posted imageMSDN Library Online | Ваше мнение о модераторах: user posted imageBarazuk user posted imageRikkie
  
> Псевдошумовой сигнал , Как сгенерировать?
    Решил продолжить разработку LC-метра из звуковой карты.
    Обсуждался также здесь.
    Решил увеличить количество рабочих частот (гармоник).

    Собственно задача:
    Как должны распределяться фазы гармоник,
    чтобы максимальная амнлитуда суммарного сигнала была минимальной?
    Чтобы впихнуть как можно больше гармоник в ограниченый динамический диапазон звуковой карты.

    Пример: Сложим косинусы всех частот - получим типа дельта функцим с максимальной амплитудой
    равной сумме амплитуд всех гармоник. Если добавить к каждой гармонике произвольную фазу от 0 до 2 Пи выданную
    генератором случайных чисел, то в некоторых случаях удавалось получить макс. амплитуду порядка 40% от исходной. Визуально это выглядело как шумовой сигнал.

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

      В текущей формулировке можно сказать только одно:
      Амплитуда суммарного сигнала будет явно меньше или равна сумме амплитуд гармоник.
      Всегда. Пока работает принцип суперпозиции (а он здесь точно работает).

      Всё потому, что звуковые частоты очень сильно различаются (в 1000 раз?).
      А значит, как бы ни варьировались начальные фазы (амплитуды ведь даны) гармоник,
      рано или поздно придёт момент, когда некоторые из них (а может и сразу все) сложатся в фазе.

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

      Удачи
        Цитата Const @
        Определить, какие данные в принципе можно варьировать (и как), а какие - нет.


        Только фазы, амплитуды гармоник = 1. Набор гармоник выбирается произвольным образом по алгоритму
        Min + Step*i, все числа целые.
        В диапазоне от произвольно заданой минимальной до произвольно заданной максимальной с произвольно заданым шагом.

        Попробую переформулировать на примере.
        Рассмотрим конкретный случай.
        Пусть задан самплинг скажем 96000. Делаю waveOut буфер из 2 в степени 12 (4096) точек.
        Тогда основная гармоника - 96000/4096 = 23.4 Гц. Будем интересоваться первыми 10-ю гармониками. Пусть гармоники одинаковой амплитуды = 1. Будем интересоваться размахом колебаний- т.е. Max-Min.
        Возьмем для начала синусы гармоник -
        Мах= 7.596б, Min= -7.596, Размах= 15.193
        Теперь косинусы -
        Мах= 10.000, Min= -2.798, Размах= 12.798 (Уже меньше)

        Теперь такую комбинацию (нашел подбором) где 1 означает косинус, -1 означает минус косинус гармоники:
        Гармоника Знак косинуса
        1 1
        2 -1
        3 -1
        4 -1
        5 1
        6 -1
        7 -1
        8 1
        9 -1
        10 -1


        Тогда
        Мах= 3.134, Min= -4.727, Размах= 7.861 (Самый маленький, меньше не нашел - в 2 раза меньше чем с синусами!)

        Для этого конкретного случая я нашел перебором. Что делать, если шаг не 1 гармоника, а 2, например, или 3?
        Опять перебирать, или алгоритм какой есть? И если нечинается не с первой, а с десятой, например? Опять перебирать?
        Кстати, выяснил что лучшие результаты получаются с +-косинусами, с синусами в любом случае размах больше.

        Хочу сделать возможность детального и обзорного изучения импеданса в LC метре. Чтобы диапазон можно было менять в процессе измерения произвольным образом.


        Цитата Const @
        Можно попытаться найти такой временной кусок


        Временной кусок не получится, нужно весь целиком для FFT.

        Цитата Const @
        Удачи

        Спасибо!
        Чуствую не простая это задача, надо было в алгоритмах спрашивать...
          РЕШЕНИЕ:

          1. Берём КРАТНЫЕ частоты, а за основную какую-либо (ЛЮБУЮ, хоть "первую", хоть "вторую" ...) частоту W
          2. Строим синус-ряд с коэффициентами b_2k-1=32765/(2k-1), k=1,2,... , то есть
          S(t) = 32765*(sin(W*t)/1 + sin(3*W*t)/3 + sin(5*W*t)/5 + ...)
          3. Пишем S(t) в буфер
          4. Наслаждаемся тем, что полученный сигнал оптимально использует динамический диапазон карточки, поскольку его амплитуда гарантированно высока, но не превысит максимально допустимой для 16-битного звука (для восьмибитного коэффициент ставим не 32765, а 127 и не забываем про сдвиг в положительную область).

          График прилагается.
          Прикреплённый файлПрикреплённый файл_____.rar (8.56 Кбайт, скачиваний: 152)
            Const
            Мне же нармоники с ОДИНАКОВОЙ амплитудой нужны, я же писал, а в вашем примере амплитуда зависит от гармоники...
            Например, амплитуда 5-ой гармоники 5*W в 5 раз меньше чем амплитуда W.
            Насчет максимальной амплитуды (в смысле 32765 или 127) - не так важно, у меня все равно сигнал нормализируется перед записью в буфер.

            Цитата Const @
            127 и не забываем про сдвиг в положительную область

            Спасибо, это я не знал.
              Вопрос изначально стоял так:
              Цитата
              существует ли алгоритм генерации псевдошумового сигнала минимальной амплитуды при заданной амплитуде каждой гармоники (например все гармоники одинаковой амплитуды)?

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

              Спрашивается, разве я не предлагаю решение именно этих проблем???

              Далее, существует такое понятие как адаптация кода. Я имею очень смутное представление об устройстве LC-метра, а о чужом коде и подавно. Поэтому предлагаю решение, которое мне кажется если не самым оптимальным, то по крайней мере очень логичным. Получится ли у тебя "малой кровью" совместить свой код и моё предложение - решать ТОЛЬКО тебе. Наверняка разный вес гармоник можно будет как-то учесть при анализе (???).

              Кстати, есть ещё одно кардинальное предложение: что мешает подавать частоты последовательно, одну за одной? Да, это займёт больше времени, но зато не будет возникать никаких заморочек с густотой точек измерения и уровнем сигнала.
              Сообщение отредактировано: Const -
                Цитата Const @
                Вопрос изначально стоял так:

                Цитата
                существует ли алгоритм генерации псевдошумового сигнала минимальной амплитуды при заданной амплитуде каждой гармоники (например все гармоники одинаковой амплитуды)?


                Заданная амплитуда - имеется в виду задается пользователем, убывающая или возрастающая с частотой или плоский спектр - это определяется заранее.

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

                Цитата Const @
                Наверняка разный вес гармоник можно будет как-то учесть при анализе (???).

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

                Цитата Const @
                Кстати, есть ещё одно кардинальное предложение: что мешает подавать частоты последовательно, одну за одной?

                Некрасивое решение и как вы заметили
                Цитата Const @
                это займёт больше времени


                Закрываю тему.
                  Цитата DVK @
                  Так вот собственно вопрос - существует ли алгоритм генерации псевдошумового сигнала минимальной амплитуды при заданной амплитуде каждой гармоники (например все гармоники одинаковой амплитуды)?

                  Гармоники, как известно, бывают ТОЛЬКО у гармонического сигнала.
                  У шумового сигнала гармоник не бывает.
                  Впрочем, если под "одинаковой амплитудой гармоник шума" подразумевается белый шум, т.е. шум с постоянной спектральной плотностью, то как раз для такого вида шума существует алгоритм его генерации, обеспечивающий максимальную величину отношения среднеквадратичного значения к амплитуде. Для этого каждый последующий отсчет выбирается посредством ДПСЧ из двух значений: Амплитуда и -Амплитуда.
                    Цитата andriano @
                    У шумового сигнала гармоник не бывает.


                    Поэтому он и назван псевдошумовым...

                    Цитата andriano @
                    для такого вида шума существует алгоритм его генерации, обеспечивающий максимальную величину отношения среднеквадратичного значения к амплитуде


                    Вот это уже интересно

                    Цитата andriano @
                    Для этого каждый последующий отсчет выбирается посредством ДПСЧ из двух значений: Амплитуда и -Амплитуда.


                    ДПСЧ - это что такое?
                    Так, с амплитудой это "+" или "-", а с фазой как? Это синусы или косинусы?

                    Я для себя, в общем, уже решил проблему, привожу кусок кода, если кому интересно

                    ExpandedWrap disabled
                      type
                        TWaveChannel = array[0..High(Integer) div SizeOf(Double) - 1] of Double;
                        pWaveChannel = ^TWaveChannel;
                       
                        // Унифицированный блок данных для ввода/вывода со звуковой карты, а также последующей обработки.
                        TWaveData = record  
                          Flags: LongWord; // Зарезервировано для других целей, здесь не используется
                          Sampling: LongWord; // Sampling для WaveOut
                          Count: Integer; // Длина буфера = 2^N , где N - целое.
                          Data: array[0..1] of pWaveChannel; // Собственно данные для 2-х каналов
                        end;
                       
                       
                      procedure GenSpectrum(afMin, afMax: Double; var aWaveData: TWaveData);
                      // Заполняет частотный диапазон от примерно afMin до примерно afMax гармониками, определяемыми
                      // значениями TWaveData.Sampling и TWaveData.Count
                      // afMin - минимальное частота, afMax - максимальная частота в Герцах
                       
                      var
                        af0, af1, // Мин. и Макс. гармоники
                        akf, i: Integer;
                        aTau: Double;
                      begin
                        with aWaveData do begin
                       
                        // Генерация сигнала с линейно меняющейся частотой    
                        // В начале временного отрезка низкая, в середине высокая, в конце опять низкая
                          af0:= Round(afMin*Count/Sampling);
                          if af0 < 1 then
                            af0:= 1;
                          akf:= 2*Round(0.5*(afMax - afMin)*Count/Sampling);
                          af1:= af0 + akf;
                          if af1 > (Count div 2) - 1 then
                            af1:= (Count div 2) - 1;
                          akf:= af1 - af0;
                          for i:= 0 to Count - 1 do begin
                            aTau:= 0.5 - Abs(0.5 - i/Count);
                            Data[0, i]:= Cos(2*Pi*aTau*(af0 + akf*aTau));
                            Data[1, i]:= Data[0, i]; // Во второй канал пишем то же что и в первом
                          end;
                       
                       
                        // Его Фурье образ
                          WaveFFT(aWaveData);  
                       
                       
                        // Нормировка этого образа.
                        // Если амплитуда косинуса > 0, то она приравнивается к 1,
                        // Если она < 0 то к -1
                        // Если косинус вне интервала, или синус то = 0
                          for i:= 0 to (Count div 2)-1 do with aWaveData do begin
                            Data[0, 2*i+1]:= 0;
                            if (i < af0) or (i > af1) then
                              Data[0, 2*i]:= 0
                            else
                              if Data[0, 2*i] > 0 then
                                Data[0, 2*i]:= 1
                              else
                                Data[0, 2*i]:= -1;
                            Data[1, 2*i]:= Data[0, 2*i];     // Во второй канал пишем то же что и в первом
                            Data[1, 2*i+1]:= Data[0, 2*i+1]; // Во второй канал пишем то же что и в первом
                          end;
                       
                        // Обратное Фурье
                          WaveIFFT(aWaveData);
                        end;
                      end;


                    Только для низжших гармоник работает плохо, в смысле выдает не самую "компрессированую" комбинацию. Радуе то, что и не самую "амплитудную"

                    ЗЫ
                    Используя такую динамическую компрессию снял проходную АЧХ своей карты с разрешением до герца - они трёхгорбые с максимумами примерно на 3800, 11500, 19000 Гц,
                    минимумами примерно на 7800, 15500 Гц.
                      > ДПСЧ - это что такое?

                      Датчик песевдослучайных чисел.

                      > Так, с амплитудой это "+" или "-", а с фазой как? Это синусы или косинусы?

                      Я знаю, что такое фаза (а также синусы и косинусы) у гармонического сигнала. Или у Фурье-разложения периодического сигнала.
                      Но какая фаза может быть у непериодического сигнала вообще и псевдошумового в частности?
                      И гармоник у псевдошумового сигнала не бывает.

                      Генерация псевдошумового сигнала по указанному в предыдущем посте алгоритму (mono).

                      ExpandedWrap disabled
                        for i := 0 to LenSample-1 do
                          Data[i] := 2.0*(random(2) - 0.5);
                        andriano
                        Алгоритм ясен, только не факт, что все гармоники будут одинаковой амплитуды...
                        Да, здесь уместно говорить о гармониках, потому как Фурье образ такого цифрового шума даст дискретный спектр - сигнал-то все равно цифровой и гармоники будут от нулевой до LenSample div 2 - 1 в вашем примере (по Котельникову - минимум 2 точки на гармонику).

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

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

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

                          >Да, здесь уместно говорить о гармониках, потому как Фурье образ такого цифрового шума даст дискретный спектр - сигнал-то все равно цифровой и гармоники будут от нулевой до LenSample div 2 - 1 в вашем примере (по Котельникову - минимум 2 точки на гармонику).

                          Вообще-то это ИСКАЖЕНИЕ сигнала, вносимое преобразованием Фурье, а не имманентная характеристика сигнала.
                          Если мы берем фрагмент шумового сигнала и зацикливаем его - тогда "да", сигнал становится периодическим и у него есть гармоники. При этом если мы захотим увеличить разрешение спектра путем добавления промежуточных отсчетов, то их амплитуды следует приравнять 0.
                          Если же мы работаем с единственным фрагментом, то реальный спектр есть не совокупность дискретных гармоник, а гладкая огибающая. Т.е. если мы хотим увеличить разрешение спектра, то в отличие от предыдущего случая нам надо промежуточные значения не приравнивать 0, а интерполировать между точками полученного спектра.
                          Т.е. в зависимости от поставновки задачи получаем разные результаты.

                          >Я думал как-то более цивильно можно закомпрессовать заданное число гармоник одинаковой амплитуды в сигнал с минимальной амплитудой варьируя только фазу гармоник либо случайным образом с помощью ДПСЧ (некрасиво и как выяснилось при моделировании - неэффективно) либо каким другим способом, например что привёл в предыдущем посте.

                          Так и не понял, чем тебя не устраивает предложенный мной алгоритм:
                          - прост в реализации,
                          - обеспечивает минимально возможный пикфактор (т.е. теоретически максимальное отношение среднего к амплитудному),
                          - обеспечивает "плоский" спектр во всем рабочем диапазоне частот.

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

                          "Выглядит" - слишком ненадежная характеристика. Давно известно, что по осциллограмме трудно объективно судить о свойствах сигнала. В частности, предложенный мной сигнал на осциллограмме будет мало похож на шумовой, но, тем не менее, будет обладать практически всеми характеристиками (кроме пикфактора, по которому мы оптимизируем) реального шумового сигнала.
                            Цитата andriano @
                            Вообще-то это ИСКАЖЕНИЕ сигнала, вносимое преобразованием Фурье


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

                            Цитата andriano @
                            Если мы берем фрагмент шумового сигнала и зацикливаем его

                            Да, я хочу его именно зациклить, почему бы и нет? Все равно потом через Фурье прогоняется.


                            Цитата andriano @
                            Так и не понял, чем тебя не устраивает предложенный мной алгоритм:
                            - прост в реализации,


                            Бесспорно

                            Цитата andriano @
                            - обеспечивает минимально возможный пикфактор (т.е. теоретически максимальное отношение среднего к амплитудному),


                            Тоже верно, особенно если в вашем примере random(2) - 1 поставить уж тогда для симметрии, а то у вас сдвиг в положительную область.

                            Цитата andriano @
                            - обеспечивает "плоский" спектр во всем рабочем диапазоне частот.


                            Ну если зацикленный, то не плоский, да и весь рабочий диапазон тоже не всегда нужно. Я же писал раньше - от некой мининальной до некой максимальной частоты которые задаются пользователем. Зачем мне засирать оставшуюся часть спектра, если я ее все равно не использую? Из-за этого амплитуда полезных гармоник упадет и соотношение сигнал/шум соответственно.
                              Цитата
                              Тоже верно, особенно если в вашем примере random(2) - 1 поставить уж тогда для симметрии, а то у вас сдвиг в положительную область.

                              Гм...
                              А если еще раз внимательно посмотреть код?
                              Или сгенерить им десяток-другой чисел?
                              Цитата

                              Ну если зацикленный, то не плоский, да и весь рабочий диапазон тоже не всегда нужно. Я же писал раньше - от некой мининальной до некой максимальной частоты которые задаются пользователем. Зачем мне засирать оставшуюся часть спектра, если я ее все равно не использую? Из-за этого амплитуда полезных гармоник упадет и соотношение сигнал/шум соответственно.

                              Минимальная частота определяется длиной используемого фрагмента, максимальная - частотой дискретизации.
                              Кстати, совершенно неочевидно, что применив к получаемому таким образом сигналу полосовой фильтр и уменьшив, таким образом, среднее, мы не получим возрастания максимума амплитуды. Впрочем, на этом можно поэкспериментировать.
                                Подскажите, насколько реально с помощью теории псевдошумового сигнала запрограммировать генератор кривой поверхности игровой трассы, например как в такого плана играх hill-climb-racing ?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0595 ]   [ 15 queries used ]   [ Generated: 26.04.24, 21:08 GMT ]