How can I shift and add a discrete-time signal simultaneously

50 Ansichten (letzte 30 Tage)
Lindsey Fisher am 6 Sep. 2017
Beantwortet: Sk Group am 8 Feb. 2021
I know how to shift and add a signal separately but I'm unsure on how to do it together. So when I have these following conditions
n = -8:8;
x1 = [0 0 0 0 0 0 0 1 2 3 2 1 0 0 0 0 0];
x2 = [0 0 0 0 0 3 -3 2 -2 1 -1 0.5 -0.5 0 0 0 0];
Then y[n] = x1[n-2]+x2[n]. What do I do?
0 Kommentare-2 ältere Kommentare anzeigen-2 ältere Kommentare ausblenden

Melden Sie sich an, um zu kommentieren.

Antworten (4)

Shagun Sharma am 21 Jan. 2020
%As far as I understand, you want to shift and add a signal simulaneously, in your question which is
%y[n] = x1[n-2]+x2[n]
%where:
n = -8:8;
x1 = [0 0 0 0 0 0 0 1 2 3 2 1 0 0 0 0 0];
x2 = [0 0 0 0 0 3 -3 2 -2 1 -1 0.5 -0.5 0 0 0 0];
%Its good that you have both the signals of same length otherwise things would have been a bit different and we would have to %make signals of equal length first. But here i will try my best to cover both the aspects and please give my answer a vote if you %find it worthy.
%Let us first define new shifted range of x1.
n1=n-2;
%Now the approach I am going to explain can be used for both the cases i.e. where signals are of equal length or not.
%Define a signal 's1' of length same as the required output filled with zeros.
%Since the current signals are ranging from -8 to 8 (17 samples) but after shifting of one signal (n-2), its range will be from -10 %to 6,
%Thus our addition of signals will be from -10 to 6 for x1 after shifting 2 units and from -8 to 8 for x2. Therefore we must keep in %mind that our addition result y wil range from -10 to 8 overall.
%so we must define signals of this range.
n2= -10:8; %(simply speaking n1=min(min(n1),min(n)) : max(max(n1),max(n));)
s1=zeros(1,length(n2));
s2=zeros(1,length(n2));
%Now we shall be using find function to fill in the values at the indexes. For s1 the values will be of x1 with 2 units of left shift while %for s2 the values will be of x2 as it is since it is not being shifted.
s1(find(n2>=min(n1)&n2<=max(n1)==1))=x1;
%Here n2>=min(n1)&n2<=max(n1) is a logical condition which returns an array of 1 or 0 if the condition is true and the find %function finds those indices and simply assigns the value of x1 over there. This way we have successfully shifted the signal x1 %by 2 units leftwards using the logical condition of where to put values.
%Similarly
s2(find(n2>=min(n)&n2<=max(n)==1))=x2;
%Now since the dimensions of 2 signals are equal we can add our shifted and non shifted signal simultaneously.
y=zeros(1,length(n2));
y=s1+s2;
%To check the result:
figure;
subplot(4,1,1)
stem(n,x1)
title('x1[n]')
grid on
axis([-12 10 -5 5])
subplot(4,1,2)
stem(n,x2)
title('x2[n]')
grid on
axis([-12 10 -5 5])
subplot(4,1,3)
stem(n2,s1)
title('x1[n-2]')
grid on
axis([-12 10 -5 5])
subplot(4,1,4)
stem(n2,y)
title('y[n]')
grid on
axis([-12 10 -5 5])
0 Kommentare-2 ältere Kommentare anzeigen-2 ältere Kommentare ausblenden

Melden Sie sich an, um zu kommentieren.

Default am 23 Jun. 2020
Bearbeitet: Default am 23 Jun. 2020
This is easier than you might think. The two signals have the same length and are already zero-padded. Just use circshift to shift x1 to the right by 2 (the sign is negative). Then add the two signals.
n = -8:8;
x1 = [0 0 0 0 0 0 0 1 2 3 2 1 0 0 0 0 0];
x2 = [0 0 0 0 0 3 -3 2 -2 1 -1 0.5 -0.5 0 0 0 0];
yn = circshift(x1,2) + x2; % y[n] = x1[n-2]+x2[n]
stem(n,yn)
grid on
0 Kommentare-2 ältere Kommentare anzeigen-2 ältere Kommentare ausblenden

Melden Sie sich an, um zu kommentieren.

Vishwas am 14 Sep. 2017
In order to simultaneously shift and add two discrete time signals, we can only make use of indices of x1 and x2 which can only be positive integers. So, for y[n] = x1[n-2]+x2[n], n should always be greater than 3.
Based on your example, we can consider the scenarios with positive values of n
n = 3:17;
y(n) = x1(n-2) + 2*x2(n)
or a we can write a function and build a resultant signal values
function result = cal(n)
if n<3 || n>17
result = 0;
else
result = x1(n-2)+2*x2(n);
end
end
for i=1:max(size(x1))
y(i) = cal(i);
end
0 Kommentare-2 ältere Kommentare anzeigen-2 ältere Kommentare ausblenden

Melden Sie sich an, um zu kommentieren.

Sk Group am 8 Feb. 2021
MATLAB CODE:
if n1(1)< n2(1)
a = n1(1)
x1 = [zeros(1,abs(n1(1)-n2(1))) x1]
else
a = n2(1)
x1 = [zeros(1,abs(n1(1)-n2(1))) x1]
end
if n1(end)>n2(end)
b = n1(end)
x2 = [x2 zeros(1,abs(n1(end)-n2(end)))]
else
b = n2(end)
x2 = [x2 zeros(1,abs(n1(end)-n2(end)))]
end
n = a:b;
y = x1+x2;
MATLAB CODE:
n = min(min(n1),min(n2)):max(max(n1),max(n2));
y1 = zeros(1,length(n));
y2 = y1;
y1(find((n>=min(n1))&(n<=max(n1))==1))=x1;
y2(find((n>=min(n2))&(n<=max(n2))==1))=x2;
y = y1+y2;
0 Kommentare-2 ältere Kommentare anzeigen-2 ältere Kommentare ausblenden

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Signal Generation and Preprocessing finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by