#matlab #telecommunication #pulse
#matlab #телекоммуникации #импульс
Вопрос:
У меня есть базовое упражнение для телекоммуникаций с matlab, и я должен построить треугольный импульс с (-c, 0) до (c, 0) с c = 6 и амплитудой = 1 в цикле for для M импульсов и приблизиться к периодическому импульсу, используя N членов ряда Фурье. Я пока не могу найти что-то в Интернете, что могло бы мне помочь.
Аналогичный код для прямоугольного импульса, который я создал и который работает, заключается в следующем:
a = 1;
b = 3;
N = 1000;
t = linspace(a-2*a,b 2*b,N);
A = 1;
y = rect_pulse(A,a,b,t);
plot(t,y);
grid on
axis([a-2*a b 2*b 0 2*A]);
M = 5;
T=7;
t_new = linspace(a-2*a,b (M-1)*T 2*b,N);
y_new = zeros(1,N);
for index = 1:1:M
temp_y = rect_pulse(A,a (index-1)*T,b (index-1)*T,t_new);
y_new = y_new temp_y;
end
figure;
plot(t_new,y_new);
grid on;
axis([a-2*a b (M-1)*T 2*b 0 2*A]);
Где rect_pulse это:
function y = rect_pulse (A,a,b,t)
N=length(t);
y = zeros(1,N);
for index = 1:1:N
if(t(1,index)>=a) amp;amp; (t(1,index)<=b)
y(1,index) = A;
end
end
А ряд Фурье — это вот что:
function y_fourier = fourier_series_rect_pulse(a,b,To,N,t)
y_fourier = 0;
wo = (2*pi)/To;
for n = -N:1:N
f_real = @(x) cos(n*wo*x);
f_imag = @(x) sin(n*wo*x);
cn = (1/To)*(quad(f_real,a,b)) - j*quad(f_imag,a,b));
y_fourier = y_fourier cn*exp(j*n*wo*t);
end
y_fourier = real(y_fourier);
Есть идеи, как сделать это в triangle pulse?
Ответ №1:
Это, вероятно, значительно отличается от вашего подхода, но если вам интересно, вот сценарий, который я придумал для генерации треугольной последовательности импульсов, которую можно настроить. К сожалению, этот метод использует fft()
функцию, которая может быть или не быть недоступной в вашем случае. Большая часть скрипта использует индексацию и манипулирование векторами. Дополнительные спектральные компоненты могут быть видны из-за смещения постоянного тока переменной треугольной волны и ограниченного числа циклов, доступных в векторном представлении треугольной волны.
Треугольные импульсы и преобразования Фурье:
Треугольный импульс с периодом отключения:
Более высокочастотные спектральные компоненты присутствуют из-за резких углов, возникающих при переходных состояниях треугольного импульса и периода отключения.
%******************************************************%
%PROPERTIES THAT CAN BE CHANGED%
%******************************************************%
Plotting_Interval = 0.01; %0.01 seconds%
Pulse_Width = 1/20; %6 seconds%
Period = 1/20; seconds (should be at least the pulse width)%
Start_Time = 0;
End_Time = Pulse_Width*1000; %(1000 pulses)%
%******************************************************%
if(Period < Pulse_Width)
Period = Pulse_Width;
end
Time_Vector = (Start_Time: Plotting_Interval: End_Time);
Points_Per_Unit_Time = 1/Plotting_Interval;
Half_Pulse = Pulse_Width/2;
Number_Of_Points = Pulse_Width/Plotting_Interval;
Rising_Slope = linspace(0,1,floor(Number_Of_Points/2) 1);
Falling_Slope = 1 - Rising_Slope;
Triangular_Pulse = [Rising_Slope Falling_Slope(2:end)];
t = (0: Plotting_Interval: Pulse_Width);
Periodic_Triangular_Pulse = zeros(1,length(Time_Vector));
for Cycle = 1: Period/Plotting_Interval: End_Time/Plotting_Interval
Periodic_Triangular_Pulse(1,Cycle:Cycle length(Triangular_Pulse)-1) = Triangular_Pulse(1,1:end);
end
Periodic_Triangular_Pulse = Periodic_Triangular_Pulse(1,1:length(Time_Vector));
subplot(1,2,1); plot(Time_Vector,Periodic_Triangular_Pulse);
Triangle_Frequency = 1/Period;
title("Triangular Pulse Train " num2str(Triangle_Frequency) "Hz (first 10 cycles)");
axis([0 Period*10 0 1]);
xlabel("Time (s)"); ylabel("Amplitude");
Signal_Length = length(Periodic_Triangular_Pulse);
Fourier_Transform = fft(Periodic_Triangular_Pulse);
Fs = 1/Plotting_Interval;
P2 = abs(Fourier_Transform/Signal_Length);
P1 = P2(1:floor(Signal_Length/2) 1);
P1(2:end-1) = 2*P1(2:end-1);
f = Fs*(0:(Signal_Length/2))/Signal_Length;
subplot(1,2,2); plot(f,P1)
title("Single-Sided Fourier Transform");
xlabel("Frequency (Hz)"); ylabel("Magnitude");
Запускался с использованием MATLAB R2019b