如何用for循环等基础语句在Matlab中实现序列x按整数因子M下采样
Matlab手动实现downsample下采样的多种方案
你现有写的for循环逻辑是正确的,核心是按固定间隔M从原始信号中选取采样点,缺点是采用动态拼接数组的方式,处理长信号时效率较低,以下是不同的实现方式:
1. 优化后的for循环版本(预先分配内存)
通过提前给输出数组分配内存空间,大幅提升长序列处理效率:
% x为输入信号,M为下采样倍数 len_y = ceil(length(x)/M); y = zeros(1, len_y); count = 1; for i = 1:M:length(x) y(count) = x(i); count = count + 1; end
2. 带if判断的实现版本
遍历所有信号点,通过取模判断是否符合采样间隔要求,逻辑更直观:
% x为输入信号,M为下采样倍数 y = []; for i = 1:length(x) % i-1是为了对齐第一个采样点的索引为1的规则 if mod(i-1, M) == 0 y = [y, x(i)]; end end
如果需要提升该版本效率,也可以参考第一种方案预先分配输出数组的内存
3. 索引切片实现(无循环,最高效)
Matlab原生支持数组按间隔索引,不需要写循环,代码最简洁且性能最优,等效于默认相位的downsample(x,M)函数:
y = x(1:M:end);
如果需要匹配downsample函数的相位参数phase(取值范围为0到M-1),修改起始索引即可:
% 等效于 downsample(x, M, phase) y = x(phase+1:M:end);
内容的提问来源于stack exchange,提问作者WilliamW
相关产品推荐
相关产品推荐

