16 views (last 30 days)

Show older comments

I am trying to run this code to get frequency response of h[n]:

clc;

clear;

n = 0:5;

h = [1, 0, -2, 3, 0, -2];

w = -pi:0.001:pi;

H = h.*exp(-1i*w*n);

H_mag = abs(H);

H_pha = angle(H);

subplot(2,1,1);

plot(w, H_mag, 'linewidth', 2);

grid

xlabel('\omega ');

ylabel('|H(e^{j\omega})|');

title('Magnitude Plot');

subplot(2,1,2);

plot(w, H_pha, 'linewidth', 2);

grid

xlabel('\omega ');

ylabel('\angle H(e^{j\omega}) (degrees)');

title('Angle Plot');

But I am receiving the following error:

Error using *

Incorrect dimensions for matrix multiplication. Check that the number of columns in the first matrix matches the

number of rows in the second matrix. To perform elementwise multiplication, use '.*'.

Error in B_e (line 9)

H = h.*exp(-1i*w*n);

I am not very proficient in Matlab so not able to identify the issue. Since I am using only one matrix, not able to see how can I do the required multiplication.

Paul
on 27 Mar 2021

n, h, and w are all defined as row vectors and the * operator is trying to do matrix multiplication. But what you really want is to use the .* (note the dot in front of the *) to do element-by-element multiplication. Inside the exp function you want to generate a 2d array. That array should looke like this:

[w(1)*0 w(1)*1 w(1)*2 ..... w(1)*5

.

.

.

w(N)*0 w(N)*1 w(N)*2 ..... w(N)*5]

where N is the number of elements in w. Such a matrix can be formed by:

temp = w(:) .* n(:).'

using a feature called automatic implicit expansion. w(:) stretches w as colument and n(:).' ensures it's a row vector. Try with some simple variables:

>> w = 0:2; n = 0:3;

>> w(:) .* n(:).'

ans =

0 0 0 0

0 1 2 3

0 2 4 6

Now you need the exponential of that matrix multiplied by -1j

>> exp(-1j * w(:) .* n(:).')

ans =

1.0000 + 0.0000i 1.0000 + 0.0000i 1.0000 + 0.0000i 1.0000 + 0.0000i

1.0000 + 0.0000i 0.5403 - 0.8415i -0.4161 - 0.9093i -0.9900 - 0.1411i

1.0000 + 0.0000i -0.4161 - 0.9093i -0.6536 + 0.7568i 0.9602 + 0.2794i

Now we need to mulitply each row of this marix by the sequence h[n]

>> h(:).' .* exp(-1j * w(:) .* n(:).')

ans =

0.0000 + 0.0000i 1.0000 + 0.0000i 2.0000 + 0.0000i 3.0000 + 0.0000i

0.0000 + 0.0000i 0.5403 - 0.8415i -0.8323 - 1.8186i -2.9700 - 0.4234i

0.0000 + 0.0000i -0.4161 - 0.9093i -1.3073 + 1.5136i 2.8805 + 0.8382i

Each row of this matrix is h*exp(-1j*w*n) evaluated at a single value of w and all values of h. So the last step is to sum across the columns. Note the result is a column vector

>> H = sum(h(:).' .* exp(-1j * w(:) .* n(:).'),2)

H =

6.0000 + 0.0000i

-3.2620 - 3.0834i

1.1571 + 1.4426i

Let's try with your data:

>> w = -pi:.001:pi;

>> h = [1 0 -2 3 0 -2];

>> n = 0:5;

>> H = sum(h(:).' .* exp(-1j * w(:) .* n(:).'),2);

>> plot(w,abs(H))

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

Start Hunting!