spirit
Nov 22 2005, 23:33
Впервые на таком форуме. Надеюсь, правильно выбран раздел.
Я начинаю заниматься (уже пару лет) различными алгоритмами спектрального анализа на основе преобразования Фурье. Сейчас возникла проблема построения фазового спектра. При расчете, проще всего находить мнимую и вещественную часть спектра. С амплитудами все понятно: корень из суммы квадратов мнимой и вещественной части.
А вот при нахождении фазы приходится применять функцию арктангенса. Отсюда как минимум два момента:
1) Из-за вычислительной погрешности для некоторых типовых сигналов, вместо нулевых значений мнимой и вещественной части, могут быть получены 0,000000001 или
-0,0000001. При вычислении фазы, определяется квадрант, в котором находится угол и затем арктангенс отношения мнимой части к вещественной. В таком случае знак может сыграть роль ошибки на 360 градусов.
2) Фазовый сдвиг может превышать 360 градусов. Причем, фаза, доходя до 360 может начать расти или уменьшаться.
И еще, при анализе простейших сигналов по стандартному ДПФ при построении фазовых спектров наблюдаются странные эффекты, вроде всплесков там, где их быть не должно и т.п.
Может быть, кто-то сталкивался с этим. Литература, советы, алгоритмы, опыт… Все что угодно.
Цитата(spirit @ Nov 23 2005, 02:33)

Впервые на таком форуме. Надеюсь, правильно выбран раздел.
Я начинаю заниматься (уже пару лет) различными алгоритмами спектрального анализа на основе преобразования Фурье. Сейчас возникла проблема построения фазового спектра. При расчете, проще всего находить мнимую и вещественную часть спектра. С амплитудами все понятно: корень из суммы квадратов мнимой и вещественной части.
А вот при нахождении фазы приходится применять функцию арктангенса. Отсюда как минимум два момента:
1) Из-за вычислительной погрешности для некоторых типовых сигналов, вместо нулевых значений мнимой и вещественной части, могут быть получены 0,000000001 или
-0,0000001. При вычислении фазы, определяется квадрант, в котором находится угол и затем арктангенс отношения мнимой части к вещественной. В таком случае знак может сыграть роль ошибки на 360 градусов.
2) Фазовый сдвиг может превышать 360 градусов. Причем, фаза, доходя до 360 может начать расти или уменьшаться.
И еще, при анализе простейших сигналов по стандартному ДПФ при построении фазовых спектров наблюдаются странные эффекты, вроде всплесков там, где их быть не должно и т.п.
Может быть, кто-то сталкивался с этим. Литература, советы, алгоритмы, опыт… Все что угодно.
1. Что бы не получать таких малых значений (0,000000001 или -0,0000001) делайте нормировку (масштабирование) значений сигнала перед вычислением Фурье.
2. Для устранения всплесков пользуйтесь окнами. Но изначально знайте, что полосу сигнала необходимо ограничивать аналогово перед оцифровкой, тогда всегда можно отстроиться от шумов квантования.
3. Из литературы в первую очередь - Рабинер/Голд "Цифровая обработка сигналов", а потом все остальное.
spirit
Nov 23 2005, 08:14
На счет нормировки – спасибо.
Про ограничение. Пока речь идет о тестовых сигналах. Т.е. дискретный сигнал задается чисто математический. И все остальное расчетное. Следовательно, нет никаких шумов.
С амплитудами все очень здорово получается. Ну и Рабинер и Гоулд, Сергеенко и прочие естественно читались, только вот с построение фазовых спектров там очень мало рассматривается, как и в Марпле пл..
Andrew10
Nov 23 2005, 09:03
Привет!
Может быть скажу глупость, но IMHO фазы, отличающиеся на 360 градусов, неразличимы. Поэтому вопрос не об ошибке вычисления фазы. а об удобстве рисования графика или дальнейшей обработки результатов, например дифференцирования фазы и т.д.
spirit
Nov 23 2005, 09:16
А если рассматривать звено чистого запаздывания, то вроде бы отличается. Годографы КЧХ те же. Идентификация...
В матлабе есть функция устранения скачков на 360 градусов, вроде unwrap. Но хочется знать алгоритм.
И еще, может кто-то на практике строил ФЧС (ФЧХ), как получалось? (может у меня в ДНК ошибки...). Сразу скажу, я не совсем радист, скорее математик. Но по опыту в спектральном анализе радиотехники куда лучше разбираются...
Фаза определена с периодом 2*PI. То, что мы иногда хотели бы видеть её непрерывной - это вопрос интерпретации. Восстанавливается по непрерывности, примерно так
for (i=0; i<len; i++) {
arg[i] = (S[i]).arg();
if (i!=0) {
for (j=i-1; j<i; j++) {
if (fabs(arg[j]-arg[i]) > M_PI) {// phase jump
if (fabs(arg[j]-arg[i]-2*M_PI) <= M_PI) {
arg[i] += 2*M_PI;
}else {
arg[i] -= 2*M_PI;
}
}
}
}
Andrew10
Nov 23 2005, 14:05
Вроде бы вот так можно исключить двойной проход и внутренний цикл, состоящий всегда из одного шага:
arg[0] = (S[0]).arg();
for(i=1; i<len; i++) {
arg[i] = (S[i]).arg();
if (fabs(arg[i]-arg[i-1]) > M_PI) {// phase jump
if (fabs(arg[i]-arg[i-1]-2*M_PI) <= M_PI) {
arg[i] += 2*M_PI; }
else {
arg[i] -= 2*M_PI;
}
}
}
Кроме этого, здесь подразумевается, что на одном шаге фаза не может меняться больше, чем на M_PI, то есть исключается случай, когда точка на комплексной плоскости с координатами (дествительная часть, мнимая часть) амплитуды Фурье-компоненты, при изменении частоты проходит вблизи нуля, пересекая действительную ось слева от него.
С другой стороны, в большигстве случаев отслеживать и этот вариант нет смысла.
Да. Внутреннего цикла в коде действительно нет. И предполагается, что фаза меняется непрерывно. В действительности, комплексные данные, загрублённые настолько, что фаза прыгает от отсчёта к отсчёта на величину пусть даже M_PI/2 безнадёжны и интерпретации с непрерывной фазой не подлежат.
Интерпретация появляется на этапе перехода от непрерывного случая к дискретному. Мы знаем заранее, что в непрерывном случае фаза изменяется непрерывно в зависимости от параметра (в данном случае частоты). На этом основании мы ожидаем того же от дискретного случая. Так ли это - зависит от реализации, т.е. от того в какой степени дискретный случай приближает неперерывный.
Шумы тоже могут портить картину.
spirit
Nov 23 2005, 22:36
Спасибо за идею с непрерывностью!
А что касается вопросов дискретности. Кажется, есть теорема Котельникова (она же Уиттекера, Шеннона, Найквиста), которая достаточно ясно формулирует требования к частоте дискретизации сигнала.
С шумами все понятно.
Еще раз спрошу, на практике, когда строили фазовые спектры, как получались картинки и что по ним было видно. Просто, если спектр "прыгает" от минуса к плюсу там, где быть этого не должно, то что вообще может это говорить о самом сигнале... ?
Andrew10
Nov 24 2005, 07:28
Привет!
Здесь имеется интересная проблема. Представим себе сигнал с ограниченным спектром, так что на его периферии компоненты Фурье гармоник очень малы (находятся на уровне шума или ошибок дискретизации), так что при переходе от одной компоненты к соседней в этой области спектра они случайным образом меняются на величину порядка своей амплитуды. Фаза при этом будет случайно скакать, что отражает большую относительную погрешность вычисления спектра в этой части. Приведенный выше алгоритм, прямо примененный к такому сигналу, даст следующее: пока мы доберемся до центральной части спектра, "квазинепрерывная" фаза уползет далеко от нуля. Поэтому нужно еще предусмотреть процедуру нормировки, чтобы в центральной части спектра фаза была относительно малой по величине.
2 Andrew10
Из-за этого собственно проводились опыты со вторым циклом ;-)
2 spirit
Теорема Котельникова не катит. Она относится к сигналу, но не к фазе сигнала. У фазы спектр может оказаться более широким, возможно даже бесконечным. Никогда не думал над таким ребусом. Но нутро говорит, что можно подобрать такой финитный сигнал, спектр фазы которого - нефинитный.
spirit
Nov 24 2005, 22:25
Цитата(fontp @ Nov 24 2005, 11:09)

Теорема Котельникова не катит. Она относится к сигналу, но не к фазе сигнала. У фазы спектр может оказаться более широким, возможно даже бесконечным. Никогда не думал над таким ребусом. Но нутро говорит, что можно подобрать такой финитный сигнал, спектр фазы которого - нефинитный.
Грамотно чуете! Спектры финитных сигналов обычно непрерывны. Но, теорема говорит о том, что если сигнал дискретизировать с определенной частотой – он полностью определим в частотной области и полностью восстановим.
Но вопрос таки открыт. Какую рассчитанную фазу считать верной и как определять погрешность ее вычисления. На тестовом сигнале без шума сразу видно где то, чего быть не должно, а вот при реальном анализе?
И еще, про нормировку, как ее вводить? Есть идеи?
И еще маленький момент, у меня тут получилось, что чем меньший шаг брать по расчетной частоте, тем больше вылезает ненормальных точек, в которых происходят какие-то перепады и резкие скачки. Т.е. ошибка вычислительная, видимо, накапливается.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.