На главную Наши проекты:
Журнал   ·   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
  
> FFT-спектральный анализатор
    Доброй ночи .
    Как реализовать вывод частоты с максимальной амплитудой на промежутке от 0 до 120Гц. С частотой дискретизации 240 Гц .
    Прошу помочь в написании кода на С , потому что в математике 0 .
      Взять входной массив
      Выполнить FFT
      Вычислить амплитуду комплексного результата как корень из суммы квадратов мнимой и реальной части
      Найти максимальный отcчёт амплитуды.

      Частота сигнала Fдискр/2 соответствует N/2 отсчёту массива после преобразования (вторая часть - зеркальное отражение).
        Прошу помочь написать код так как для меня FFT темный лес
          Этих кодов в инете да и на этом форуме немало
            Увы не особо то в интернете не то что надо везде спектр отображают в виде графики , а мне нужно допустим играет музыка , раз максимальная амплитуда 77Гц потом второй пик 35Гц и так далее . Вот эти показания мне и надо в цифрах
              i-й отсчет соответствует частоте Fдискр * i / N
                Цитата gmaxi @
                на промежутке от 0 до 120Гц. С частотой дискретизации 240 Гц .

                Что-то здесь не сходится.
                  Mikle
                  Почему?
                    Цитата MBo @
                    Почему?

                    Каков уровень будет на 0 Гц?
                      Постоянная составляющая
                        Цитата MBo @
                        Постоянная составляющая

                        Верно, а FFT её выдаст? За сколько семплов?
                          Mikle
                          К чему вы клоните? Выдаст, чем больше семплов тем лучше.
                          Для точного восстановления гармоник нужна частота дискретизации в 2 раза большая.
                            >Верно, а FFT её выдаст? За сколько семплов?
                            Недопонимаю смысл вопроса.
                            Нулевую выдаст всегда. Какова её интенсивность - зависит от сигнала.
                            От количества семплов (временного интервала) зависит частотное разрешение.
                            Слишком мало (нечёткое понятие) семплов - амплитуды неточные.
                              ExpandedWrap disabled
                                function DetectFirstF2(a:TArrayReal; t:Real; dwSamplesPerSec:DWord):Real;
                                var
                                 i,N,NewN:Integer;
                                 aa,b:TArrayReal;
                                 z:TArrayComplex;
                                 r:Real;
                                 fd:Real;
                                 v0,v1,v2:Real;
                                begin
                                fd:=dwSamplesPerSec;
                                N:=Length(a);
                                NewN:=(1 shl Log2Int(n))*32;
                                aa:=copy(a);
                                r:=Mean(aa);      // Находим среднее
                                sub(aa,r);        // Убираем постоянную составляющую.
                                HammingMulWindow(n,@aa[0]);
                                SetLength(aa,NewN);
                                CopyInRe(z,aa);
                                 
                                FFT(z,False);    // Получаем спектр частот
                                 
                                amp(b,z);        // Вычисляем амплитуду
                                for i:=1 to Length(b)-2 do
                                 b[i]:=0.25*b[i-1]+0.5*b[i]+0.25*b[i+1]; // Убираем небольшие шумы, могут влиять на знак 1 производной.
                                 
                                for i:=6 to Length(b) div 2 do // Отбрасываем первые частоты, которые могут помешать.И отбрасываем отрицательные частоты (div 2).
                                 begin
                                 if (b[i]>t*N/NewN) and (b[i]-b[i-1]>0) and (b[i]-b[i+1]>0) then // проверяем порог и условие выпуклости по произволдням(точка больше двух соседних)
                                   begin
                                   GetParabola(Point2DReal(i-1,b[i-1]),Point2DReal(i,b[i]),Point2DReal(i+1,b[i+1]),v0,v1,v2); // Вычисляем коэффициенты параболы для уточнения частоты
                                   Result:=(-v1/2/v0)*Fd/(NewN); // Находим максимум параболы и пересчитываем координату в частоту
                                   Exit;
                                   end;
                                 end;
                                end;
                                Теоретически точность определения амплитуды гармоники растёт с ростом отношения длительности выборки к периоду. Когда выборка короче половины периода, определять нечего вообще - период при нуле равен бесконечности.
                                Для определения постоянной составляющий нужно иметь историю сигнала на бесконечность назад.
                                Могу на примере объяснить, лень писать, но, вроде бы, и так понятно. Если надо будет - распишу подробнее.
                                  Mikle
                                  Цитата Mikle @
                                  период при нуле равен бесконечности.Для определения постоянной составляющий нужно иметь историю сигнала на бесконечность назад.Могу на примере объяснить, лень писать, но, вроде бы, и так понятно. Если надо будет - распишу подробнее.

                                  И что с того?
                                  Lim_{W->0}{A_0*Sin(W*t)}=>A_0*Sin(0)=A_0*1=A_0
                                  Lim_{W->0}{W=1/T}=>T=бесконечность

                                  Когда бы выполняем дискретное преобразование Фурье мы выполняем его не над бесконечным сигналом, а над конечным.
                                  Это тоже допускается если у нас сигнал периодический и вычисления идут над периодом. (Мы считаем ряд Фурье вместо преобразования Фурье)
                                  Считается что сигнал повторяется бесконечное число раз с периодом равному K-семплов.
                                  Какой период у константы A_0? Ответ: произвольный.

                                  Но вообще постоянный сигнал. Он постоянный не только на 0 частоте, но на всех частотах.
                                  Тут дело другое, что есть такое явление как эффект Гиббса. Если в двух словах, то так как сигнал хотя и постоянный когда мы берём К семплов то мы как-бы выполняем П-образную фильтрацию, которая корёжит гармоники которые не кратны данному периоду K-семплов.
                                  Из-за этого постоянный сигнал приобретает форму SinC(W).

                                  Но это полбеды переменный сигнал, тоже растекается подобным образом. С этим уже борются оконные функции. Они корректируют частоты и фазу.
                                  Сообщение отредактировано: Pavia -
                                    Это справедливо, но не особо страшно по сравнению с другими "прелестями" ПФ.
                                    Например, если задана функция Sin(x)+1, то после ПФ на большом интервале (N значений) амплитуда нулевого отсчёта будет порядка N. Однако на интервале, захватывающем полпериода с нулевой начальной фазой, амплитуда будет в полтора раза больше положенного. Вряд ли можно сказать, что это в корне неправильно, ведь по такому кусочку нельзя достоверно судить о функции
                                    Сообщение отредактировано: MBo -
                                      Нужно похожее сделать только для микроконтроллера есть и библиотека только ничего не понятно кто может помочь ?
                                      Прикреплённый файлПрикреплённый файлt.JPG (56,03 Кбайт, скачиваний: 643)
                                      Прикреплённый файлПрикреплённый файлFFT.rar (2,61 Кбайт, скачиваний: 214)
                                        Цитата gmaxi @
                                        сделать только для микроконтроллера

                                        А что, это разве не для микроконтроллера? ;)
                                        AVR невооруженным глазом. :rolleyes:
                                        Где вы это отрыли?
                                          Отрыл в интернете , да для avr .
                                          Нужно реализовать вывод частоты с максимальной амплитудой на промежутке от 0 до 120Гц. С частотой дискретизации 240 Гц .
                                          Допустим берем авр на вход ацп цепляем микрофон , дальше отслеживаем пик на частоте от 0 до 120Гц и выводим его на lcd допустим пик был 50Гц вот это значение и выводим .
                                          Увы высшей математике :'( темный лес вот и прошу помощи в написании кода .
                                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                          0 пользователей:


                                          Рейтинг@Mail.ru
                                          [ Script execution time: 0,0475 ]   [ 18 queries used ]   [ Generated: 28.03.24, 15:04 GMT ]