Matlab Code for DTFT to get frequency response
12 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.
0 Comments
Answers (1)
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))
0 Comments
See Also
Categories
Find more on Numbers and Precision 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!