Проблема, с которой вы столкнулись, это именно то, о чем говорила 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) просто введет линейный член фазы в частотной области и не решит исходную проблему.
На практике, вместо того, чтобы пытаться точно установить длину последовательности в соответствии с периодом сигнала, следует применять управление окнами, если сигнал должен быть исследован в частотной области. В этом случае вы действительно должны убедиться, что ваши сигналы правильно выровнены, чтобы окно ослабляло конечные точки, сглаживая таким образом разрыв. Это приводит к расширению основного лепестка БПФ, но также контролирует утечку.