Problem using symbolic sinc?
6 views (last 30 days)
Show older comments
Hello everybody,
I have tried to get a plot of the absolute value of the Fourier transform for a square pulse using the equation . The code I used is
syms x y w F
A = 1;
tau = 1;
y(x) = piecewise((x<-tau/2), 0, ...
(x==tau/2 & x==tau/2), 0.5, ...
(x>-tau/2 & x<tau/2), 1, x>0.5, 0);
figure1 = figure;
axes1 = axes('Parent',figure1);
hold(axes1,'on');
fplot(y,[-1.5 1.5],'Parent',axes1,'MarkerSize',6,'LineWidth',3);
ylabel('\Pi(t)','FontSize',26,'FontName','Calibri');
xlabel('t','FontSize',26,'FontName','Calibri');
ylim(axes1,[0 1.5]);
box(axes1,'on');
hold(axes1,'off');
set(axes1,'FontName','Calibri','FontSize',20,'XAxisLocation','origin',...
'XTick',[-1/2 0 1/2],'XTickLabel',{'-\tau/2','0','\tau/2'}, ...
'XLimitMethod','tight','YAxisLocation','origin',...
'YTick',[0 1],'YTickLabel',{'0','A'},'YLimitMethod','tight',...
'ZLimitMethod','tight');
F = A*tau*sinc(w/(2*pi)*tau);
figure2 = figure;
axes2 = axes('Parent',figure2);
fplot(abs(F),[-12*pi/tau 12*pi/tau],'Parent',axes2,'MarkerSize',6,'LineWidth',3);
ylim(axes2,[-0.5 A*tau*1.2]);
xlim(axes2,[-13*pi/tau 13*pi/tau])
box(axes2,'on');
hold(axes2,'off');
set(axes2,'FontSize',14,'XAxisLocation','origin','XTick', ...
[-8*pi/tau -6*pi/tau -4*pi/tau -2*pi/tau 0 2*pi/tau 4*pi/tau 6*pi/tau 8*pi/tau], ...
'XTickLabel',{'-8\pi/\tau','-6\pi/\tau','-4\pi/\tau','-2\pi/\tau','0',...
'2\pi/\tau','4\pi/\tau','6\pi/\tau','8\pi/\tau'},'XTickLabelRotation',90, ...
'YGrid','on','YAxisLocation','origin','YTick',[0 A*tau],'YTickLabel',{'0','A\tau'});
ylabel('|F(\omega)|','FontSize',18,'FontName','Calibri');
xlabel('\omega','FontSize',18,'FontName','Calibri');
The plot of seems to be correct but the gray dashed line is a bit surprising.
Than I tried to get the I have tried to get a plot of the absolute value of the Fourier transform for a pulse of sinusoidal function given by the equation using the foolowing code
syms x t
A = 1;
f=8;
g = A*cos(2*pi*f*t);
figure3 = figure;
axes3 = axes('Parent',figure3);
hold(axes3,'on');
% fplot(heaviside(t + 0.5), [-2, 2],'Parent',axes22,'MarkerSize',6,'LineWidth',3)
% fplot(-heaviside(t - 0.5), [-2, 2],'Parent',axes22,'MarkerSize',6,'LineWidth',3)
fplot(t,g*(heaviside(t + 0.5)-heaviside(t - 0.5)),[-2 2],'Parent',axes3,'MarkerSize',6,'LineWidth',2)
ylim(axes3,[-1.5,1.5]);
xlim(axes3,[-1.5,1.5]);
xlabel("t")
ylabel("f(t)")
hold(axes3,'off');
set(axes3,'FontName','Calibri','FontSize',20,'XAxisLocation','origin',...
'XTick',[-1 -0.5 0 0.5 1],'XTickLabel',{'-\tau','-\tau/2','0','\tau/2','\tau'}, ...
'XLimitMethod','tight','YAxisLocation','origin',...
'YTick',[-1 0 1],'YTickLabel',{'-1','0','1'},'YLimitMethod','tight',...
'ZLimitMethod','tight');
%%
syms w F
f = 8;
w0=2*pi*f;
tau = 1;
F(w) = tau/2*(sinc((w-w0)/(2*pi)*tau)+sinc((w+w0)/(2*pi)*tau));
figure4 = figure;
axes4 = axes('Parent',figure4);
fplot(abs(F),[-5*f*pi/tau 5*f*pi/tau],'Parent',axes4,'MarkerSize',6,'LineWidth',3);
ylim(axes4,[-0.5 tau]);
xlim(axes4,[-6*f*pi/tau 6*f*pi/tau]);
box(axes4,'on');
hold(axes4,'off');
set(axes4,'FontSize',14,'XAxisLocation','origin','XTick', ...
[-w0/tau 0 w0/tau],'XTickLabel',{'-\omega_0','0','\omega_0'},...
'YGrid','on','YAxisLocation','origin','YTick',[0 tau/2],...
'YTickLabel',{'0','\tau/2'});
ylabel('F(\omega)','FontSize',18,'FontName','Calibri');
xlabel('\omega','FontSize',18,'FontName','Calibri');
Again, there are gray dashed lines, this time for the frequencies and .
This meake me think that there is a problem with the sinc function for argument close to or equal 0.
I have done a simple test
>> syms x
>> f = sinc(x)
f =
sin(pi*x)/(x*pi)
>> x = -5:5
x =
-5 -4 -3 -2 -1 0 1 2 3 4 5
>> subs(f)
Error using symengine
Division by zero.
Error in sym/subs>mupadsubs (line 168)
G = mupadmex('symobj::fullsubs',F.s,X2,Y2);
Error in sym/subs (line 153)
G = mupadsubs(F,X,Y);
but
>> sinc(0)
ans =
1
Then I have repeated the calculations for the sinusoidal pule but this time I did not used the symbolic math and I got a bettrer plot.
f = 8;
w0=2*pi*f;
tau = 1;
w = -5*f*pi/tau:0.1*pi:5*f*pi/tau;
% F(w) = tau/2*(sinc((w-w0)/(2*pi)*tau)+sinc((w+w0)/(2*pi)*tau));
F = tau/2*(sinc((w-w0)/(2*pi)*tau)+sinc((w+w0)/(2*pi)*tau));
figure5 = figure;
axes5 = axes('Parent',figure5);
% fplot((abs(F)),[-5*f*pi/tau 5*f*pi/tau],'Parent',axes23,'MarkerSize',6,'LineWidth',3);
plot(w,abs(F),'Parent',axes5,'MarkerSize',6,'LineWidth',3)
ylim(axes5,[0 tau*0.75]);
xlim(axes5,[-6*f*pi/tau 6*f*pi/tau]);
box(axes5,'on');
hold(axes5,'off');
set(axes5,'FontSize',14,'XAxisLocation','origin','XTick', ...
[-w0/tau 0 w0/tau],'XTickLabel',{'-\omega_0','0','\omega_0'},...
'YGrid','on','YAxisLocation','origin','YTick',[0 tau/2],...
'YTickLabel',{'0','\tau/2'});
ylabel('|F(\omega)|','FontSize',18,'FontName','Calibri');
xlabel('\omega','FontSize',18,'FontName','Calibri');
Is there a proble with the sic function for symbolic calculation?
0 Comments
Accepted Answer
Paul
on 17 Oct 2022
Edited: Paul
on 17 Oct 2022
We can get rid of the vertical asymptote with:
syms x y w F
A = 1;
tau = 1;
F = A*tau*sinc(w/(2*pi)*tau);
figure
fplot(abs(F),[-12*pi/tau 12*pi/tau],'ShowPoles','off')
ylim([0 1])
Or
figure
fplot(w,abs(F),[-12*pi/tau 12*pi/tau])
ylim([0 1])
Of course, either approach also removes the aysmptotes for actual poles that might be of interest, should any exist.
0 Comments
More Answers (1)
Walter Roberson
on 14 Oct 2022
y(x) = piecewise((x<-tau/2), 0, ...
(x==tau/2 & x==tau/2), 0.5, ...
(x>-tau/2 & x<tau/2), 1, x>0.5, 0);
(x==tau/2 & x==tau/2) is redundant. If you want to test for equality with tau/2 then use a single condition. If you want to test for it being either tau/2 or -tau/2 then use the correct condition, (x==-tau/2 | x == tau/2)
The x>0.5 seems inconsistent with the rest of the tests. It would make more sense if you were testing x>tau/2
Perhaps you want
y(x) = piecewise(abs(x) < tau/2, 1, ...
abs(x) == tau/2, 0.5, ...
0);
3 Comments
Walter Roberson
on 14 Oct 2022
Instead of subs(f) use
arrayfun(@(X) limit(f, X), x)
This will be slower.
Or you could create a mask
sincs = zeros(size(x));
mask = x ~= 0;
sincs(mask) = subs(f, x(mask));
sincs(~mask) = 1;
See Also
Categories
Find more on Chebyshev in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!