Как рассчитать передаточную функцию и построить ее после преобразования Фурье в частотной области по величине и фазе? - PullRequest
0 голосов
/ 02 декабря 2018

У меня возникла проблема с отображением передаточной функции по величине и фазе после преобразования Фурье из двух сигналов.

Сначала я использовал excel xlxs, чтобы прочитать столбец и построить график во времени.домен и частотная область, затем я вычисляю передаточную функцию, и это нормально.

Но для амплитуды и фазы у меня проблемы с их построением.Я устал их составлять, но это совершенно неправильно.Кто-нибудь поможет мне с этим?

Вот код и excel файл также.

solarcell1 = xlsread('solarcell.xlsx','A2:C100005');
t=solarcell1(:,1);
N=length(t);
Channel1V = solarcell1(:,2);
Channel2V = solarcell1(:,3);
sig1=Channel1V;
sig2=Channel2V;
fs=1/((solarcell1(3)-solarcell1(2))*1e-3);
FA1=fs/length(sig1);
FA2=fs/length(sig2);
frange1=-fs/2:FA1:fs/2-FA1;
frange2=-fs/2:FA2:fs/2-FA2;
subplot(3,2,1);
plot(t,sig1);
hold on
plot(t,sig2);
title('Input and Output of Solar cell');
xlabel('Time');ylabel('Amplitude');
subplot(3,2,2);
plot(t,sig2);
title('Output');
xlabel('Time');ylabel('Amplitude');
z1=fftshift(fft(sig1))/length(t);
subplot(3,2,3);
plot(frange1,abs(z1));
title('Input');
xlabel('Freq.');ylabel('Amplitude');
z2=fftshift(fft(sig2))/length(t);
subplot(3,2,4);
plot(frange2,abs(z2));
title('Output');
xlabel('Freq.');ylabel('Amplitude');
TFC=z2./z1;
magnitude=20*log(abs(TFC));
phase=atan2(imag(TFC),real(TFC));
subplot(3,2,5);
bode(frange1(1002:N),magnitude(1002:N));
title('Magnitude');
xlabel('Freq.');ylabel('Magnitude');
subplot(3,2,6);
semilogx(frange1(1002:N),phase(1002:N));
title('Phase');
xlabel('Freq.');ylabel('Phase');

1 Ответ

0 голосов
/ 15 января 2019

Я вижу три проблемы в предоставленном вами коде.

Во-первых, вы неправильно используете bode.Эта функция принимает в качестве аргумента dynamic model system, и вы дали два вектора frange1(1002:N) и magnitude(1002:N).Сейчас я предлагаю вам просто использовать plot.

subplot(3,2,5);
plot(frange1(1002:N),magnitude(1002:N));
title('Magnitude');
xlabel('Freq.');ylabel('Magnitude');

Тогда использование semilogx также рискованно, если у вас есть отрицательные значения для оси x.С frange1=-fs/2:FA1:fs/2-FA1; вы не должны просить semilogx об этом.На данный момент я предлагаю plot.

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

subplot(3,2,6);
plot(frange1(1002:N),unwrap(phase(1002:N)));
title('Phase');
xlabel('Freq.');ylabel('Phase');

Он отображает:

enter image description here

...