Error "It must be of type 'Type::MATLABOutput"
4 views (last 30 days)
Show older comments
James Manns
on 1 Feb 2024
Edited: Walter Roberson
on 2 Feb 2024
I have a signal x(t)=exp(-100t), t>0. I'm trying to plot the ESD against frequency and then find and plot the 35dB bandwidt and the bandwidth that contains 99% of the energy.. The EDS plots fine but I get the following error for the 35dB plot:
"Error using / Invalid return value '[1/(2*abs(100 + w*1i)^2)]'. It must be of type'Type::MATLABOutput'.
Error in untitled3 (line 22) f_3dB = solve(ESD == max(ESD)/2, f);"
The code is below:
clc
clear all
syms t w;
x_t = exp(-100*t)*(heaviside(t));
X_w = fourier(x_t, w);
ESD = abs(X_w)^2;
% Plot ESD against linear frequency
f = linspace(-10, 10, 1000); % frequency range for plotting
ESD_plot = subs(ESD, w, 2*pi*f);
figure;
plot(f, ESD_plot);
title('Energy Spectral Density (ESD)');
xlabel('Frequency (Hz)');
ylabel('ESD');
grid on;
f_35dB = solve(ESD == max(ESD)/3162, f);
disp(['35 dB Bandwidth: ', num2str(2*f_35dB)]);
% Define frequency step size for numerical integration
df = 0.001;
freq_range = -10:df:10;
% Calculate energy in each frequency band
energy_in_band = double(subs(ESD, w, 2*pi*freq_range)) * df;
% Find the bandwidth containing 99% of the energy
cumulative_energy = cumsum(energy_in_band);
desired_energy = 0.99 * max(cumulative_energy);
bandwidth_99percent_energy = 2 * freq_range(find(cumulative_energy >= desired_energy, 1, 'first'));
disp(['Bandwidth containing 99% of the energy: ', num2str(bandwidth_99percent_energy)]);
0 Comments
Accepted Answer
Walter Roberson
on 2 Feb 2024
Edited: Walter Roberson
on 2 Feb 2024
f_35dB = solve(ESD == max(ESD)/3162, f);
max(ESD) returns a max() expression that is incompatible with the result of the calculation. It does not calculate the w for which ESD is the maximum and substitute that w to get the maximum ESD.
And you are asking to also solve f which is a vector of numeric frequencies.
1 Comment
Walter Roberson
on 2 Feb 2024
Edited: Walter Roberson
on 2 Feb 2024
clc
clear all
syms t w;
x_t = exp(-100*t)*(heaviside(t));
X_w = fourier(x_t, w);
ESD = abs(X_w)^2;
% Plot ESD against linear frequency
f = linspace(-10, 10, 1000); % frequency range for plotting
ESD_plot = subs(ESD, w, 2*pi*f);
figure;
plot(f, ESD_plot);
title('Energy Spectral Density (ESD)');
xlabel('Frequency (Hz)');
ylabel('ESD');
grid on;
best_w = solve(diff(ESD, w),w)
max_ESD = subs(ESD, w, best_w)
f_35dB = double(solve(ESD == max_ESD/3162))
disp(['35 dB Bandwidth: ', num2str(2*f_35dB)]);
% Define frequency step size for numerical integration
df = 0.001;
freq_range = -10:df:10;
% Calculate energy in each frequency band
energy_in_band = double(subs(ESD, w, 2*pi*freq_range)) * df;
% Find the bandwidth containing 99% of the energy
cumulative_energy = cumsum(energy_in_band);
desired_energy = 0.99 * max(cumulative_energy);
bandwidth_99percent_energy = 2 * freq_range(find(cumulative_energy >= desired_energy, 1, 'first'));
disp(['Bandwidth containing 99% of the energy: ', num2str(bandwidth_99percent_energy)]);
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!