python - 在将 MATLAB 代码转换为 python 时需要帮助
问题描述
出于学习目的,我一直在尝试在 Python 中实现 Prof.Selesnick 的 DWT 实现的 MATLAB 代码。
function [lo, hi] = afb(x, af)
% [lo, hi] = afb(x, af)
%
% Analysis filter bank
% x -- N-point vector (N even); the resolution should be 2x filter length
%
% af -- analysis filters
% af(:, 1): lowpass filter (even length)
% af(:, 2): highpass filter (even length)
%
% lo: Low frequency
% hi: High frequency
%
N = length(x);
L = length(af)/2;
x = cshift(x,-L);
% lowpass filter
lo = upfirdn(x, af(:,1), 1, 2);
lo(1:L) = lo(N/2+[1:L]) + lo(1:L);
lo = lo(1:N/2);
% highpass filter
hi = upfirdn(x, af(:,2), 1, 2);
hi(1:L) = hi(N/2+[1:L]) + hi(1:L);
hi = hi(1:N/2);
我特别困在lo(1:L) = lo(N/2+[1:L]) + lo(1:L);
我尝试lo[np.arange(0,L)]=lo[N // 2 + np.concatenate([np.arange(0,L)])) + lo[np.arange(0,L)]
过,但似乎没有用。将不胜感激任何帮助。
我有一个大小为 10,000 的输入信号 x,当我执行代码时,它会停在该特定行并显示index 5001 is out of bounds for axis 0 with size 5001
. 我好像越界了
解决方案
在 Octave 会话中:
>> lo = 1:10;
>> L=3; N=4;
>> N/2+[1:L]
ans =
3 4 5
>> lo(N/2+[1:L])+lo(1:L)
ans =
4 6 8
在numpy
:
In [100]: lo = np.arange(1,11)
In [101]: L=3; N=4
In [102]: N/2+np.arange(0,L)
Out[102]: array([2., 3., 4.])
In [105]: lo[int(N/2)+np.arange(0,L)]+lo[:L]
Out[105]: array([4, 6, 8])
等效地
In [106]: n=int(N/2); lo[n:n+L]+lo[:L]
Out[106]: array([4, 6, 8])
推荐阅读
- javascript - 为什么 JavaScript 保留关键字允许作为变量名?
- mysql - 写通信包超时
- c# - 如何将区域列表与“地址”(字符串)匹配并获取列表和字符串中都存在的区域 Asp.net core
- javascript - Cucumber-js 中的装饰步骤实现
- linux - 在 bash 中定义标志参数
- pycharm - graphviz.backend.ExecutableNotFound:未能执行 ['dot', '-Tpng'],请确保 Graphviz 可执行文件位于系统的 PATH 中
- jquery - 使用jquery更改属性
- python - Ubuntu Buildozer JAVA_HOME 设置为无效目录
- twilio - 我们如何使用 twilio studio 工作流程跟踪消息状态(如排队、已发送、已交付等)
- wordpress - 无法从生产服务器访问 XAMPP Wordpress 站点