Pull to refresh

Comments 22

Любопытный метод, спасибо!

А может ли он разрешить две близко лежащие синусоиды в сигнале? Допустим, мы нашли в спектре ДПФ пик (который на самом деле является «слившимися» двумя пиками от близкорасположенных гармоник). Что в этом случае даст гетеродинирование? Позволит ли оно достаточно точно определить амплитуду и фазу первой синусоиды, чтобы, после вычитания ее из сигнала, алгоритм смог детектировать вторую синусоиду?
Скорее нет, чем да. Насколько я понял, речь идёт о близости гармоник в диапазоне ± 1 единицы частоты (опять же, в контексте числа длин волн на сигнал). Гетеродинирование не решает проблему недостатка разрешающей способности по частоте. Увы. Правда, при определенной разнице между частотами гармоник, можно, по крайней мере приблизительно, определить соотношение амплитуд, и, собственно, то, что гармоник — две.
Я вот читал в книге С.Л. Марпл-Мл. «Цифровой спектральный анализ и его приложения» о модифицированном методе Прони, который пытается представить фрагмент сигнала в виде суммы незатухающих синусоид произвольной частоты. Соответственно, спектр по мод. Прони является строго линейчатым. Там даже были какие-то шансы разделить близкорасположенные гармоники лучше, чем это возможно с помощью ДПФ. Правда, я этот метод так и не реализовал и не испытал.

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

Также рекомендую более подходящую, чем Java, платформу для отладки и испытания методов обработки сигналов — Matlab.
Очень удобно для испытания методов обработки сигналов использовать Python с библиотекой SciPy как бесплатная альтернатива Matlab.
Любопытно. Спасибо, отправил в список на прочтение.

Сам пользуюсь лицензионной Wolfram Mathematica для подтверждения принципа. Дело привычки наверно. В данном случае Java выбрал можно сказать случайно. Устал от веб-разработки, решил что-нибудь standalone написать.
Фраза «Но как показал наш спектральный анализ...» больше не вызывает у меня улыбку.
Вопрос к формуле с рассчетом СКО, если мне не изменяет память, в таком случае она получится смещенной.
Да, не изменяет. Оценка СКО будет смещённой. Намекаете на поправочный множитель n/(n-1)?
Да вроде прямым текстом говорю. Не знаю, после универа деление для дисперсии на n-1 в подкорку въедается уже, прям глаз режет, когда не так. При больших n конечно разница будет не такой уж большой, но все-таки математически это неверно.
Принимается. Спасибо за замечание! В ближайшее время поправлю.
Вот что говорят по этому поводу William H. Press et al в книге «Numerical recipes in C++»:

«We might also comment that if the difference between N and N-1 ever matters to you, then you are probably up to no good anyway — e.g., trying to substantiate a questionable hypothesis with marginal data».
Чего еще ожидать от физика-практика. Если оценка смещенная, в общем случае ей нельзя пользоваться. И если он утверждает «а, пофиг, все равно разница небольшая», то это говорит не в его пользу. У меня в универе тоже есть на кафедре куча заслуженных доцентов, которые всякий маразматичный бред несут, хотя в свое время были очень крутыми ребятами/девчатами. Если человек застрял в изучении случайных процессов на уровне учебника Вентцеля — то для студента 2-3 курса техвуза это очень даже неплохо, но вот для подобных утверждений явно недостаточно.

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

Я сейчас пишу черновик на тему регрессионного/дисперсионного анализов, как выложу, сможете оценить разницу при таком «наплевательском» отношении к константам. Вычесть единичку это очень трудно, я понимаю, но всё же. Ну и нужно понимать, что если такая небрежность наблюдается по всей программе, то ошибка будет накапливаться, что в результате даст ощутимую погрешность, а то и решающую.
Вот было бы неплохо привести пример, при каких условиях пренебрежение N-1 может дать ощутимую или решающую погрешность в результате обработки данных. Потому что математика — это одно, а физика вносит свои коррективы.

А то при чисто «математическом» подходе, если вы измерили массу три раза и получили 100, 100 и 101кг — вы можете посчитать среднее, которое равно 100,333333333333кг с точностью ~1e-15. С такой точностью не известна даже масса национальных эталонов килограмма. Но повода для гордости здесь нет. Какой смысл считать 15 цифр после запятой, если погрешность измерений составляет порядка 1e-2?

Физики-практики постоянно вынуждены чем-то пренебрегать. Без этого невозможно было бы в разумные сроки и с разумными затратами решать практические задачи.
Это не повод переносить такой подход в другие области.

Не вопрос: допустим я хочу понять зависимость от каких-нибудь факторов по странам мира. Это всего лишь N=200, соответственно относительная погрешность будет 0.5% при подсчете одной только дисперсии, при использовании в дальнейшем ошибка будет накапливаться, т.к. не в одной только дисперсии забьют на правильную формулу. Если же буду брать статистику по странам Европы, то получу всего несколько десятков точек. При активном использовании в формулах ошибка может достигнуть 30-40% на ровном месте. Из-за того, что кому-то лень написать единичку.

Поделили на n — получили заниженную оценку дисперсии. На практике дисперсия будет больше. Скорее всего ненамного, но это всё относительно. И при малых n может быть крайне существенно.
Несколько месяцев назад мы с коллегой столкнулись именно с рассмотренной задачей, только формулировка была несколько иная: есть измерительное устройство, которое регистрирует и оцифровывает синусоидальный сигнал с шумами, и в микроконтроллере нужно было точно рассчитать, какое кол-во оцифрованных отсчетов приходится на один период преобладающей гармоники. Понятно, что в общем случае кол-во отсчетов в периоде должно получиться дробным, а точность требовалась аж до 5-го знака после запятой. Идея алгоритма, который я применил, была схожа с Вашим решением, но только преобразование Фурье использовать не пришлось. Я просто вычислял несколько «чистых» синусоид, имеющих частоту из окрестности поиска, и считал свертку с оцифрованным сигналом — это фактически была корреляционная функция, и ее экстремум соответствовал искомому значению. Однако кучу раз считать синусы в МК дело затратное, поэтому решено было «чистые» синусы заменить на периодическую кусочно-линейную «пилу», от чего точность совсем не пострадала.
Так что с практической точки зрения полезная статья :)
Рад, что вам понравилось ) Интересная идея. И как в плане производительности на МК оно?
Для выборки сигнала, представленной более чем 3000 отсчетами, занимает около нескольких секунд (3-4). Но это, разумеется, зависит от того, какая арифметика используется — целочисленная либо с плавающей точкой (для integer производительность раза в 1.5 больше). Микроконтроллер из семейства stm32.
Я бы вам рекомендовал для указанных целей попробовать систему ФАПЧ (в английской терминологии — PLL). Доказано, что эта система обеспечивает максимальное соотношение «точность / время измерения» при измерении частоты. К тому же, она мало затратная в реализации. Матчасть только надо изучить, там она нетривиальная.
Подскажите, пожалуйста, почему по оси амплитуд на диаграммах амплитудного спектра значение этих самых амплитуд как-то, мягко говоря, не очень похоже на амплитуды, которые содержит исходный сигнал? Как правило, амплитуда на амплитудном спектре существенно (на порядки) выше амплитуды исходного сигнала, если смотреть на pdf с примерами.
Я полагаю, здесь достаточно простой ответ из области математики. Просто я от этой области далек. Может кто подскажет?
Автору спасибо за статью!
Это не баг, это фича. Амплитуду из спектра следует поделить на половину длины сигнала. А для нулевой частоты — на всю длину сигнала.
Спасибо за ответ!
Длина сигнала в данном случае — это в секундах или в числе дискретных отрезков?
Длина сигнала в данном контексте — число его (сигнала) отсчётов.
Sign up to leave a comment.

Articles