需要将MATLAB代码转换为python的帮助吗

2024-09-27 07:20:42 发布

您现在位置:Python中文网/ 问答频道 /正文

为了便于学习,我一直在尝试用Python实现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)] 但它似乎不起作用。谢谢你的帮助

我有一个大小为10000的输入信号x,当我执行代码时,它正好停在那一行,并说index 5001 is out of bounds for axis 0 with size 5001。我好像被禁止了


Tags: 代码lonphifilterlengthafeven
3条回答

在八度音程中:

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

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

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

  • 正向FWT:级别i->;过滤器->;下样本->;级别i+1
  • 反向FWT:级别i+1->;上样本->;过滤器->;级别i

numpy图书馆已经有了一堆ITEN,可以帮助我们制作切片

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

对于“越界”错误,我建议您检查索引,并记住Python计数从0开始

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

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

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

我希望我帮了你一点忙

相关问题 更多 >

    热门问题