Трудно понять фазу, рассчитанную с помощью БПФ. Короткая демонстрация Matlab для иллюстрации

Я тестирую фазовый выход fft сигнала sin и сигнала cos. Приведенный ниже сценарий создает сигналы и выполняет для них БПФ. Бункеры, амплитуда которых ниже порога, обнуляются для фазового спектра, потому что меня интересует только фаза сигналов.

% 10khz 10 second long time interval
t = 0:1 / 10000:10;

%1khz cos
c = cos(2 * pi * 1000 .* t);
%1khz sin
s = sin(2 * pi * 1000 .* t);

%ffts
C = fft(c)/length(c);
S = fft(s)/length(s);

%magnitude and phases of ffts
CA = abs(C); %cos magnitude
SA = abs(S); %sin magnitude

Cthresh = max(CA) * 0.5;
Sthresh = max(SA) * 0.5;

%find all indeces below the threshold
Crange = find(CA < Cthresh);
Srange = find(SA < Sthresh);

%set the indeces below the threshold to 0 - phase will be meaningless for
%noise values
CP = angle(C);
CP(Crange) = 0;
SP = angle(S);
SP(Srange) = 0;

Если вы построите CP — фазу cos — вы получите фазу 0,3142 в ячейках, соответствующих частоте сигнала cos, и нули в других местах. Это пи/10. Я ожидаю получить пи. Почему это?

Если вы нанесете SP, вы получите значения 1,2566. Я ожидаю получить пи/2 или 1,5708. 80% от ожидаемого значения. Что вызывает эти ошибки?


person Daniel    schedule 31.10.2011    source источник


Ответы (2)


Если ваш входной сигнал не является идеально периодическим по длине апертуры БПФ (точное целое число полных периодов), синусоиды будут прерывистыми на концах апертуры БПФ. Таким образом, вы получите фазу, которая является средним значением двух разных фаз на обоих концах входного вектора БПФ.

Если вам нужна более разумная фаза, привяжите фазу ваших синусоид к центру входного вектора БПФ и выполните сдвиг БПФ перед БПФ. Это приведет к непрерывной синусоиде в опорном положении нулевой фазы с одной фазой вместо странного среднего значения.

Также обратите внимание, что Matlab может ссылаться на фазу на вторую точку в выбранной синусоиде, например. vectorElement[i=1], не первый, vectorElement[i=0]. Это будет иметь фазу pi/10 для синусоиды периода = 20 выборок.

person hotpaw2    schedule 31.10.2011
comment
Я вижу проблему в отсутствии целого числа полных периодов в диапазоне. Что вы имеете в виду, ссылаясь на синусоиду на центр вектора, а Matlab иногда ссылаясь на фазу на вторую точку? - person Daniel; 02.11.2011

У вас есть проблема, о которой заявил hotpaw2. У вас есть 100001 выборка в t, поэтому у вас нет идеально периодического сигнала, поэтому у вас есть утечка. Это означает, что у вас есть функция sin()/sin() из вашего неявного прямоугольного окна, свернутая с вашим решением. Вот что меняет вашу фазу.

Если вместо этого вы попробуете следующее:

t = 0:1 / 10000:9.9999;
c = cos(2 * pi * 1000 .* t);
%1khz sin
s = sin(2 * pi * 1000 .* t);
%ffts
C = fft(c)/length(c);
S = fft(s)/length(s);

вы обнаружите, что фаза косинуса равна нулю (чего и следовало ожидать), а фаза синуса равна пи/2.

Выполнение линейного сдвига во временной области (используя fftshift) просто вводит линейный фазовый член в частотную область и не решит исходную проблему.

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

person Dave    schedule 14.09.2016