코드에서 몇 가지 실수를 저질렀습니다.
코드에서 x의 값을 인쇄하지 않았습니다. 대칭 직사각형 펄스를 분석한다고 가정합니다. 그러나 샘플 수는 홀수 값입니다. 이것은 신호가 대칭이 아니므로 의 차이가 이론상의 텍스트 북 값과 비교하여 작음을 의미합니다.
직사각형 펄스의 대역폭은 무한합니다. 그러나 FFT의 경우 샘플링 속도는 신호의 최고 주파수 인 의 두 배 이상이어야합니다. 즉, 샘플링 속도는 최소 2 * 무한대 여야합니다. 불행, 할 수 없다. 아무도 그렇게 할 수 없습니다. 결과로 앨리어싱이 발생합니다. 즉, 결과에 오류가 있음을 의미합니다. 좋은 소식은 직사각형 함수의 경우이 효과가 sinc 함수의 도움으로 보상 될 수 있다는 것입니다.
올바른 것을 만들면 올바른 교과서 계수를 얻을 수 있습니다. 입력 신호의 형식이 (N = 10) 11111-1-1-1-1-1 인 경우 함수는 홀수 함수입니다. 이것은 f (-t) = -f (t)를 의미합니다. 이 경우 직사각형은 일련의 사인 함수로 구성 할 수 있습니다. 이론적 함수이다 :
F (t) = 4/PI (SIN (중량) + 1/3 죄 (3 중량) + 1/5 죄 (5 중량) + 1/7 죄 (7 중량). ..)
sin (2wt) 또는 sin (4wt)와 같은 짝수의 빈도가 없습니다. 이것은 스펙트럼의 모든 두 번째 주파수가 0이라는 것을 의미합니다. 수치 노이즈로 인해이 값은 정확히 0은 아니지만 0에 가깝습니다. 이 값에서 위상을 계산하면 의미없는 값이 생성됩니다. 다른 주파수는 사인 함수의 푸리에 변환 값입니다. 사인 함수의 FFT는 순수한 허수입니다. 합계의 모든 요소에는 동일한 부호가 이므로 모든 각도는 같은 값을 갖습니다. 즉 pi/2입니다. 당신이 수정 된 코드를 찾아 아래
: FFT의
close all;
clear all;
clc;
t=-2:0.01:(2-0.01);
dt=t(2)-t(1); %increment of time
fs=1/dt; % sampling rate
n=length(t); %number of samples
x = [ones(1,n/2), -ones(1,n/2)];
X=fft(x)/n; %fourier transform of x%
f=0:n-1; %making frequency axis
sincComp = @(N) (exp(-i*pi*(f/N)).*sinc(f/N)).';
% Perform the compensation
comp = transpose(sincComp(n));
Xcorrected = X.*comp;
X_angle=angle(Xcorrected(2:2:n)); %the phase of X
figure;
subplot(3,1,1);
hold on;
stem(f(1:10), pi*abs(X(1:10))/2, 'ob', 'LineWidth', 3);
plot(f(1:10), pi*abs(Xcorrected(1:10))/2, 'or', 'LineWidth', 3);
hold off;
grid on;
title('Absolute value of FFT result', 'FontSize', 18);
xlabel('frequency', 'FontSize', 18);
ylabel('abs', 'FontSize', 18);
legend(['FFT'], ['FFT compensated']);
subplot(3,1,2);
hold on;
stem(f(1:10), pi*real(X(1:10))/2, 'ob', 'LineWidth', 3);
plot(f(1:10), pi*real(Xcorrected(1:10))/2, 'or', 'LineWidth', 3);
hold off;
grid on;
title('Real value of FFT result', 'FontSize', 18);
xlabel('frequency', 'FontSize', 18);
ylabel('real', 'FontSize', 18);
subplot(3,1,3);
hold on;
stem(f(1:10), pi*imag(X(1:10))/2, 'ob', 'LineWidth', 3);
plot(f(1:10), pi*imag(Xcorrected(1:10))/2, 'or', 'LineWidth', 3);
hold off;
grid on;
title('Imaginary value of FFT result', 'FontSize', 18);
xlabel('frequency', 'FontSize', 18);
ylabel('imag', 'FontSize', 18);

결과 아연 보상 FFT를
처음 10 비 제로의 위상 값 주파수 :
>> X_angle(1:10)*2/pi
ans =
-1.0000 -1.0000 -1.0000 -1.0000 -1.0000 -1.0000 -1.0000 -1.0000 -1.0000 -1.0000
예, 각도는 크기와 관련이 없습니다. 당신이 올바르게하고있는 것처럼 들리 겠지만 결과는 정확합니까? – Trogdor
음, 그건 까다로운 부분입니다. 그 물결이 교과서의 한 예이기 때문입니다. 그래서 책에는 진폭 스펙트럼과 각도 스펙트럼이 있습니다. 그래서 나는 대답을 알고 있다고 말할 수 있습니다 – CSjune
당신은 직각 펄스를 정확하게 생성하고 있다고 확신합니까? – Trogdor