MATLAB: функция развертки - PullRequest
5 голосов
/ 07 июля 2010

Я обсуждаю с кем-то из Mathworks re: функцию unwrap, в которой есть "ошибка" для допусков перехода, отличных от & pi; и хотелось бы получить некоторые другие перспективы :

Описание

Q = unwrap(P) исправляет радиальные углы фазы в векторе P, добавляя кратные значения & plusmn; 2 & pi; когда абсолютные скачки между последовательными элементами P больше или равны допустимому отклонению по умолчанию & pi; радиан. Если P - матрица, развертка работает по столбцам. Если P - многомерный массив, развертывание действует в первом неинглетонном измерении.

Q = unwrap(P,tol) использует толщину перехода вместо значения по умолчанию & pi;.

Существует две возможные интерпретации документации:

  1. Q = unwrap(P,tol) исправляет радиальные фазовые углы в векторе P, добавляя кратные значения & plusmn; 2 & pi; когда абсолютные скачки между последовательными элементами P больше или равны толь радианам. Если P - матрица, развертка работает по столбцам. Если P - многомерный массив, развертка работает с первым неинглетонным измерением.

    Пример: * * тысяча двадцать-пять

    >> x = mod(0:20:200,100); unwrap(x, 50)
    ans =
        0 20.0000 40.0000 60.0000 80.0000 81.6814 101.6814 121.6814 141.6814 161.6814 163.3628
    
  2. Q = unwrap(P,tol) исправляет элементы в векторе P, добавляя кратные значения & plusmn; 2 * tol, когда абсолютные скачки между последовательными элементами P больше или равны tol. Если P - матрица, развертка работает по столбцам. Если P - многомерный массив, развертывание действует в первом неинглетонном измерении.

    * +1032 * Пример: * 1 033 *
    >> x = mod(0:20:200,100); unwrap(x, 50)  
    ans =  
        0    20    40    60    80   100   120   140   160   180   200
    

Фактическое поведение unwrap() в MATLAB (по крайней мере, до R2010a) - № 1. Моя интерпретация unwrap() состоит в том, что это должно быть # 2, и, следовательно, есть ошибка в поведении. Если поведение unwrap() соответствует # 2, то развертка может использоваться в качестве инверсии для мода для медленно меняющихся входных данных, то есть unwrap(mod(x,T),T/2) = x для векторов x, где последовательные элементы изменяются менее чем на tol = T / 2.

Обратите внимание, что эта 2-я интерпретация является более общей, чем углы, и может разворачивать что угодно с периодом обтекания T. (по умолчанию T = 2 & pi; для радиан, 360 для градусов, 256 для 8-битных чисел, 65536 для 16 и др.)

Итак, мой вопрос:

Возможны ли варианты поведения №1? Какая интерпретация имеет больше смысла?

Ответы [ 4 ]

6 голосов
/ 22 февраля 2011

Интерпретация # 1 - это то, как я читаю документацию, и я думаю, что это имеет смысл. Я мог бы представить, чтобы использовать его для восстановления пройденного расстояния от колесного датчика. Для медленных скоростей допуск не имеет значения, но для высоких скоростей (достаточно высоких, чтобы нарушить теорему выборки, т. Е. У вас меньше двух выборок на оборот колеса), допуск помогает вам получить правильную реконструкцию, если вы знаете направление.

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

% example for 16 bit integers
>> x1 = [10 5 0 65535 65525];
T = 65536;
x2 = T * unwrap(x1 * 2 * pi / T) / (2 * pi)
x2 =
     10.0000    5.0000         0   -1.0000  -11.0000

Или просто создайте свою собственную функцию:

function ret = generic_unwrap(x, T)
  ret = T * unwrap(x * 2 * pi / T) / (2 * pi);
end
1 голос
/ 08 июля 2010

Я всегда предполагал, что второе поведение было реальным, но никогда не проверял его. Буквальное чтение файла справки указывает на поведение # 1. Но это не то, что кто-то хотел бы сделать. В качестве простого примера рассмотрим распаковку в градусах

x = mod(0:30:720, 360)
y = unwrap(x,180)

очевидно, вы бы хотели y = 0: 30: 720, но вместо этого вы получите ...

y =

Columns 1 through 7

     0   30.0000   60.0000   90.0000  120.0000  150.0000  180.0000

Columns 8 through 14

210.0000  240.0000  270.0000  300.0000  330.0000  333.0088  363.0088

Columns 15 through 21

393.0088  423.0088  453.0088  483.0088  513.0088  543.0088  573.0088

Columns 22 through 25

603.0088  633.0088  663.0088  666.0176

что неверно (y больше не соответствует тому же углу, что и x, то есть точка разворачивания)

Может ли кто-нибудь привести пример, когда вам нужно поведение # 1 (текущее поведение?)

1 голос
/ 07 июля 2010

Поведение # 1 имеет смысл, поскольку предполагается, что входное значение равно радианам , а не градусам . Корректировка добавляет пи / 2, если вы выше допуска на прыжок, так что все в порядке.

Было бы неплохо, если бы у unwrap была функция, позволяющая работать с любыми сериями, а не только с радиальными углами.

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

0 голосов
/ 04 апреля 2017
x = mod(0:30*pi/180:4*pi, 2*pi);
y = unwrap(x)*180/pi;

Работает в радианах, но не в градусах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...