Треугольный импульс с преобразованием Фурье

#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