【问题标题】:Need help in converting MATLAB code to python在将 MATLAB 代码转换为 python 时需要帮助
【发布时间】:2021-08-29 23:32:25
【问题描述】:

出于学习目的,我一直在尝试在 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。我好像越界了。

【问题讨论】:

  • 您需要在这里学习的第一件事是如何正确报告问题。使用回溯显示实际错误。不要只说“不起作用”。这让我们很恼火 :) 你需要付出一些努力来理解这个错误。
  • 看来你让它变得比现在复杂得多。您不需要arange,并且在 MATLAB 代码中没有串联。
  • 您好,很抱歉,这是我第一次在 stackoverflow 上发帖,我只是经常潜伏在这里。

标签: python numpy matlab dwt


【解决方案1】:

numpy 库已经有一堆可以帮助我们处理切片的元素。

当你需要对一个 numpy 数组进行切片时,例如a = np.array([1,2,3,4,5,6,7,8,9,10]),你可以使用a[:n] 进行切片,n 将是序列中的最后一个元素。如果n = 2a[:2] = [1,2]。试试这个,你会写出干净的代码。

对于“超出范围”的错误,我建议您检查索引并记住 Python 计数从 0 开始。

例如(使用我们上面定义的“a”数组):

a[0] = 1
a[-1] = 10 
a[9] = 10

请注意,最后一个元素位于索引 9。我相信这是你的错误,你必须使用foo[5000] 而不是foo[5001]

希望对你有所帮助!

【讨论】:

  • 我想再次询问是否有一种方法可以为每个索引添加一个标量值,以便以某种方式将其移动该值。就像 a=np.array ([1,2,3,4,5,6,7,8,9,10]) , a[2:4] 我想从索引 2 添加一个值 2 到4 将其移至 a[4:6]。因为我真的不知道如何在 Python 中做到这一点。
  • 这很简单。例如,将“n”作为您的偏移量,您可以使用 a[ 2 +n : 4+n ] 进行切片。
【解决方案2】:

在 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])

【讨论】:

    【解决方案3】:

    我不熟悉 upfirdn 函数,但您的函数似乎应用了前向 DWT 的一级?

    This answer 包含 Python 中(多级)DWT 的前向实现。这是 Mallat 的古老 FWT 配方,可能与您的略有不同,但基于相同的原理:

    • 前向 FWT:级别 i -> 过滤器 -> 下采样 -> 级别 i+1
    • 逆FWT:级别i+1->上采样->过滤->级别i

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 2020-08-11
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多