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

У меня есть базовое упражнение для телекоммуникаций с 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) && (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);

Есть идеи, как превратить это в треугольный импульс?


person alkis    schedule 20.11.2020    source источник


Ответы (1)


Это, вероятно, значительно отличается от вашего подхода, но если вам интересно, вот сценарий, который я придумал для создания треугольной последовательности импульсов, которую можно настроить. Этот метод, к сожалению, использует функцию fft(), которая может быть или не быть запрещенной в вашем случае. Большая часть скрипта использует индексирование и манипулирование векторами. Дополнительные спектральные компоненты могут быть видны из-за постоянного смещения переменной треугольной волны и ограниченного количества циклов, доступных в векторном представлении треугольной волны.

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

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

Треугольный импульс с периодом дежурства:

Спектральные компоненты с более высокими частотами присутствуют из-за крутых углов, которые возникают в переходных состояниях треугольного импульса и в скважности.

Треугольный импульс с циклом отключения

%******************************************************%
%PROPERTIES THAT CAN BE CHANGED%
%******************************************************%
Plotting_Interval = 0.01; %0.01 seconds%
Pulse_Width = 1/20; %6 seconds%
Period = 1/20; %10 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

person MichaelTr7    schedule 21.11.2020