Error "It must be of type 'Type::MATLABOutput"

7 vues (au cours des 30 derniers jours)
James Manns
James Manns le 1 Fév 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)]);

Réponse acceptée

Walter Roberson
Walter Roberson le 2 Fév 2024
Modifié(e) : Walter Roberson le 2 Fév 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 commentaire
Walter Roberson
Walter Roberson le 2 Fév 2024
Modifié(e) : Walter Roberson le 2 Fév 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)
best_w = 
0
max_ESD = subs(ESD, w, best_w)
max_ESD = 
f_35dB = double(solve(ESD == max_ESD/3162))
f_35dB = 0.0000e+00 - 5.5232e+03i
disp(['35 dB Bandwidth: ', num2str(2*f_35dB)]);
35 dB Bandwidth: 0-11046.3327i
% 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)]);
Bandwidth containing 99% of the energy: 19.506

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Mathematics dans Help Center et File Exchange

Tags

Produits


Version

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by