Трудность понимания фазы, рассчитанной БПФ.Короткая демонстрация matlab для иллюстрации - PullRequest
1 голос
/ 31 октября 2011

Я тестирую фазовый выход синусоидального сигнала и сигнала 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% от ожидаемого значения. Что вызывает эти ошибки?

Ответы [ 2 ]

1 голос
/ 31 октября 2011

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

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

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

0 голосов
/ 14 сентября 2016

Проблема, с которой вы столкнулись, это именно то, о чем говорила hotpaw2. У вас есть 100001 выборок в т, поэтому у вас нет идеально периодического сигнала, поэтому у вас есть утечка. Это означает, что у вас есть функция 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);

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

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

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

...