错误使用 xlim (line 31) 范围必须为包含递增的日期时间值的 2 元素向量

在使用MATLAB绘制以日期为x轴的数据图时,遇到了xlim设置范围的错误。文章详细介绍了错误信息及原因,提供了正确的xlim设置方法,即使用datetime类型变量的索引。

今天在使用matlab画图时遇到这样一个问题:

错误使用 xlim (line 31)
范围必须为包含递增的日期时间值的 2 元素向量。

具体图片:
在这里插入图片描述
出现这样问题的原因是我想以日期为x轴,数据为y轴,并且约束一下坐标轴范围。因为日期是datetime类型,所以我用了xlim来约束x轴范围,报错相关代码如下:

%之前的部分代码省略
day=datetime(2019,07,31)+caldays(1:30);
figure(2)
plot(day,dep_per_d);
hold on
plot(day,x,'b--')
xlim([2019-08-01,2019-08-30]);
ylim([0,330]);

这里的day生成的是2019-08-01到2019-08-30的日期矩阵
在这里插入图片描述
解决方法
xlim里写datetime类型的变量索引即可
如:

day=datetime(2019,07,31)+caldays(1:30);
xlim([day(1),day(30)]);

在这里插入图片描述
问题解决!!!

%% 光谱法测量大深径微孔深度计算程序 % 该程序通过光谱反射法测量微孔深度 % 使用傅里叶变换光谱分析技术计算微孔深度 % 数据来源于外部文件输入 %% 清除环境并设置参数 clear all; close all; clc; %% 参数设置 refractive_index = 1; % 微孔内介质折射率 filename = 'C:\Users\m\Desktop\新建文件夹\USB2H090911_11-28-50-828.txt'; % 输入文件名 %% 从文件读取光谱数据 try data = readtable(filename); % 检查数据格式 if height(data) < 100 error('数据点过少,请检查输入文件'); end % 假设第一列是波长,第二列是光强 if width(data) >= 2 lambda = data{:,1} * 1e-9; % 转换为米 I_measured = data{:,2}; else error('输入文件至少需要包含波长和光强两列数据'); end catch ME error(['读取文件时出错: ', ME.message]); end %% 光谱预处理 % 数据检查和处理 if any(diff(lambda) <= 0) % 确保波长是严格递增的 [lambda, idx] = sort(lambda); I_measured = I_measured(idx); end % 基线校正 - 使用二次多项式拟合 x = lambda - mean(lambda); % 中心化 x_scaled = x / std(x); % 缩放 p = polyfit(x_scaled, I_measured, 1); % 使用二次多项式 baseline = polyval(p, x_scaled); I_corrected = I_measured - baseline + 0.5; % 调整到合理范围 % 归一化 I_normalized = (I_corrected - min(I_corrected)) / (max(I_corrected) - min(I_corrected)); %% 傅里叶变换光谱分析 % 转换到波数空间 (单位: m^-1) wave_number = 1 ./ lambda; wave_number = wave_number - min(wave_number); % 从0开始 % 插到均匀波数网格 wave_number_uniform = linspace(min(wave_number), max(wave_number), length(lambda)); I_uniform = interp1(wave_number, I_normalized, wave_number_uniform, 'spline'); % 傅里叶变换 FT_data = fftshift(fft(I_uniform)); FT_magnitude = abs(FT_data); % 创建距离轴 (单位: m) sample_spacing = (max(wave_number_uniform) - min(wave_number_uniform)) / (length(wave_number_uniform) - 1); distance_axis = (-length(FT_magnitude)/2 : length(FT_magnitude)/2-1) * (1 / (sample_spacing * length(FT_magnitude))); %% 深度计算 % 寻找主峰位置 (排除零频附近区域) n = length(FT_magnitude); center_idx = floor(n/2) + 1; % 零频位置 search_range = max(10, floor(n/20)); % 搜索范围,至少10个点 % 创建排除零频附近的搜索向量 left_part = FT_magnitude(1:center_idx-search_range); right_part = FT_magnitude(center_idx+search_range:end); search_vector = (left_part:right_part); % 修正拼接符号 % 找到最大及其索引 [~, peak_idx] = max(search_vector); % 转换为全局索引 if peak_idx <= length(left_part) peak_idx = peak_idx; else peak_idx = peak_idx - length(left_part) + center_idx + search_range; end % 计算深度 (单位: m) %% 深度计算 % 寻找主峰位置 (排除零频附近区域) n = length(FT_magnitude); center_idx = floor(n/2) + 1; % 零频位置 search_range = max(10, floor(n/20)); % 搜索范围,至少10个点 % 只考虑正频率部分 positive_side = center_idx+search_range:n; [~, max_idx] = max(FT_magnitude(positive_side)); peak_idx = positive_side(max_idx); % 计算深度 (单位: m) % 深度 = 光程差/2 = (距离轴 * 折射率)/2 calculated_depth = abs(distance_axis(peak_idx)) * refractive_index / 2; % 确保深度为正数 calculated_depth = abs(calculated_depth); %% 结果显示 figure('Position', [100, 100, 1200, 800]); % 绘制原始光谱 subplot(2, 2, 1); plot(lambda*1e9, I_measured, 'r-', 'LineWidth', 1.5); hold on; plot(lambda*1e9, baseline, 'b--', 'LineWidth', 1); xlabel('波长 (nm)'); ylabel('反射强度'); title('测量光谱与基线'); legend('测量数据', '拟合基线'); grid on; % 绘制预处理后的光谱 subplot(2, 2, 2); plot(lambda*1e9, I_normalized, 'g-', 'LineWidth', 1.5); xlabel('波长 (nm)'); ylabel('归一化强度'); title('预处理后的光谱'); grid on; % 绘制傅里叶变换结果 subplot(2, 2, 3); plot(distance_axis*1e6, FT_magnitude, 'k-', 'LineWidth', 1.5); xlabel('光程差 (\mum)'); ylabel('幅度'); title('傅里叶变换光谱'); grid on; xlim([-100 100]); % 聚焦感兴趣区域 % 在FT图上标记峰位置 hold on; plot(distance_axis(peak_idx)*1e6, FT_magnitude(peak_idx), 'ro', 'MarkerSize', 8, 'MarkerFaceColor', 'r'); text(distance_axis(peak_idx)*1e6, FT_magnitude(peak_idx), [' 峰位置: ' num2str(distance_axis(peak_idx)*1e6, '%.2f') ' \mum'], 'FontSize', 8); hold off; % 绘制结果汇总 subplot(2, 2, 4); % 绘制微孔示意图 rectangle('Position', [0.3, 0.1, 0.1, 0.8], 'FaceColor', [0.8 0.8 0.8]); line([0.3, 0.4], [0.9, 0.9], 'Color', 'k', 'LineWidth', 2); line([0.3, 0.3], [0.1, 0.9], 'Color', 'k', 'LineWidth', 2); line([0.4, 0.4], [0.1, 0.9], 'Color', 'k', 'LineWidth', 2); text(0.25, 0.45, ['计算深度: ' num2str(calculated_depth*1e6, '%.2f') ' \mum'], 'FontSize', 10); axis off; title('测量结果汇总'); %% 输出结果 fprintf('计算微孔深度: %.2f \mu m \n', calculated_depth*1e6);修改代码使计算结果正确
最新发布
07-13
%% CIC插滤波器完整设计 % 作者:深度思考 | 最后更新:2024年7月15日 %% 系统参数设置 clear all; close all; clc; fs_in = 1.28e6; % 原始采样率 fs_out = 30.72e6; % 目标采样率 R = fs_out / fs_in; % 总插倍数24 BW = 1.08e6; % 信号带宽 M = 1; % 差分延迟 N_stages = 5; % CIC级数 %% 多级CIC分解(3×2×4) R_stages = [3, 2, 4]; % 三级分解 assert(prod(R_stages)==R, '插因子分解错误'); %% 多级CIC滤波器初始化 % 第一级CIC(3倍插) cic1 = dsp.CICInterpolator(R_stages(1), M, N_stages); % 第二级CIC(2倍插) cic2 = dsp.CICInterpolator(R_stages(2), M, N_stages); % 第三级CIC(4倍插) cic3 = dsp.CICInterpolator(R_stages(3), M, N_stages); %% 计算CIC增益 stage_gains = (R_stages*M).^N_stages; total_gain = prod(stage_gains); % 总增益(3*1)^5 * (2*1)^5 * (4*1)^5 %% 补偿滤波器设计 % 设计参数 N_comp = 128; % 补偿滤波器阶数 passband_edge = BW/2; % 通带截止 stopband_edge = fs_in/2; % 阻带起始 % 生成频率响应模板 f = linspace(0, fs_out/2, 1000); H_cic = abs(freqz(cic3, f, fs_out)); % 获取CIC响应 % 构建补偿响应(仅补偿通带) comp_response = ones(size(f)); valid_band = f <= passband_edge; comp_response(valid_band) = 1./(H_cic(valid_band)/max(H_cic)); F =[0,passband_edge/2,stopband_edge ,fs_out/2]/(fs_out/2); % FIR补偿滤波器设计 comp_filter = firpm(N_comp, [0,passband_edge,stopband_edge ,fs_out/2]/(fs_out/2),... [1 1 0 0], comp_response(1:end/2)); %% 完整信号链 signal_chain = dsp.FilterChain(... cic1, ... cic2, ... cic3, ... dsp.FIRFilter(comp_filter'), ... dsp.Scale(1/total_gain)... ); %% 测试信号生成 t = 0:1/fs_in:1e-4; % 0.1ms时基 f1 = 0.3e6; f2 = 0.8e6; % 测试频率 x = 0.7*sin(2*pi*f1*t) + 0.3*sin(2*pi*f2*t); %% 信号处理流程 y = signal_chain(x'); %% 频谱分析 figure('Position', [100 100 1200 800]) % 输入频谱 subplot(2,2,1) pwelch(x, [],[], [], fs_in) title('输入信号频谱') xlim([0 fs_in/2]) % CIC级联响应 subplot(2,2,2) [H_cic, f_cic] = freqz(cic1, 2048, fs_in*R_stages(1)); plot(f_cic, 20*log10(abs(H_cic)/max(abs(H_cic)))) hold on for stage = 2:length(R_stages) [H, f] = freqz(eval(['cic' num2str(stage)]), 2048, fs_in*prod(R_stages(1:stage))); plot(f, 20*log10(abs(H)/max(abs(H)))) end title('多级CIC频率响应') xlabel('Frequency (Hz)'), ylabel('Magnitude (dB)') xlim([0 fs_out/2]), grid on % 最终输出频谱 subplot(2,2,3) pwelch(y, [],[], [], fs_out) title('输出信号频谱') xlim([0 fs_out/2]) % 补偿滤波器响应 subplot(2,2,4) freqz(comp_filter, 1, 2048, fs_out) title('补偿滤波器响应') %% 时域波形对比 figure('Position', [100 100 800 600]) plot(t(1:50), x(1:50), 'LineWidth', 1.5) hold on t_out = (0:length(y)-1)/fs_out; plot(t_out(1:50*R), y(1:50*R)) legend('原始信号','插信号') title('时域波形对比') xlabel('Time (s)'), ylabel('Amplitude') %% 性能指标计算 % 计算SNR signal_power = rms(y)^2; noise_floor = signal_power - 10*log10(fs_out/BW); fprintf('理论信噪比: %.1f dB\n', 10*log10(signal_power/noise_floor)); % 计算通带平坦度 [H_total, f_total] = freqz(signal_chain, 2048, fs_out); passband_response = 20*log10(abs(H_total(f_total <= BW))); ripple = max(passband_response) - min(passband_response); fprintf('通带纹波: %.2f dB\n', ripple);错误使用 firpminit (line 65) 每个频带应有一个权重。 出错 firpm (line 139) [nfilt,ff,grid,des,wt,ftype,sign_val,hilbert,neg] = firpminit(order, ff, aa, varargin{:}); 出错 test (line 49) comp_filter = firpm(N_comp, [0,passband_edge/2,stopband_edge ,fs_out/2]/(fs_out/2),...修改代码错误
03-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值