希伯特数值与二维坐标的相互转换(python)

希伯特曲线具体干什么的,就不多说了,直接上代码!

class Hilbert:
    # n 行列数
    def __init__(self, n ):
        self.n = n
    def rot(self, xy, rx, ry):
        n = self.n
        if ry == 0:
            if rx == 1:
                xy[0] = n - 1 - xy[0]
                xy[1] = n - 1 - xy[1]
            temp = xy[0]
            xy[0] = xy[1]
            xy[1] = temp
        return
    def he_to_xy(self, d, xy):  # 返回hilbert数值对应的二维坐标
        n = self.n
        t = d
        xy[0] = xy[1] = 0
        s = 1
        while s < n:
            rx = int(1 & int(t / 2))
            ry = int(1 & (int(t) ^ rx))
            self.rot(xy, rx, ry)
            xy[0] += s * rx
            xy[1] += s * ry
            t /= 4
            s *= 2
        return xy[1], xy[0]
    def xy_to_he(self, xy):  # 返回二维坐标h对应的hilbert数值
        n = self.n
        d = 0
        s = n / 2
        while s > 0:

            if (int(xy[0]) & int(s)) > 0:
                rx = 1
            else:
                rx = 0
            if (int(xy[1]) & int(s)) > 0:
                ry = 1
            else:
                ry = 0
            d += s * s * ((3 * rx) ^ ry)
            self.rot(xy, rx, ry)
            s /= 2
        return d
#=========================== 测试 8x8 的 生成结果  ============================
n = 8
xy = [0, 0]
hi = Hilbert(n)
for i in range(0,n):
    for j in range(0,n):
        xy[0] = j
        xy[1] = i
        print("%4d"% int(hi.xy2d(xy)), end='')
    print()
#=========================== 测试 相互转换 ============================
xy1 = [1, 2] # i j 相反 
print(hi.xy_to_he(xy1)) 
print(hi. he_to_xy(4, xy))

结果

   0   3   4   5  58  59  60  63
   1   2   7   6  57  56  61  62
  14  13   8   9  54  55  50  49
  15  12  11  10  53  52  51  48
  16  17  30  31  32  33  46  47
  19  18  29  28  35  34  45  44
  20  23  24  27  36  39  40  43
  21  22  25  26  37  38  41  42
 13.0
(0, 2)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
希伯特变换是一种将实函数转换为复函数的方法,可以用于分析窄带信号的频谱特性。而窄带随机过程是一种平稳随机过程,其功率谱在一个较小的频带内有显著的能量集中。下面是一个在MATLAB中进行希尔伯特变换分析窄带随机过程的实验步骤: 1.生成一个窄带随机过程,可以使用MATLAB中的randn函数生成一个高斯白噪声序列,再通过一个带通滤波器将其限制在一个较小的频带内。 2.使用MATLAB中的hilbert函数对生成的窄带随机过程进行希尔伯特变换,将其转换为复函数。 3.计算希尔伯特变换后的复函数的模和相角,可以使用MATLAB中的abs函数和angle函数。 4.绘制复函数的模和相角的频谱图,可以使用MATLAB中的fft函数计算复函数的频谱,并使用MATLAB中的plot函数绘制频谱图。 下面是一个简单的MATLAB代码实现: ```matlab % 生成一个窄带随机过程 fs = 1000; % 采样率 t = 0:1/fs:1-1/fs; % 时间序列 x = randn(size(t)); % 高斯白噪声序列 [b,a] = butter(4,[100,200]/(fs/2)); % 带通滤波器 y = filter(b,a,x); % 希尔伯特变换 z = hilbert(y); % 计算模和相角 amp = abs(z); phase = angle(z); % 绘制频谱图 N = length(t); freq = (0:N-1)*fs/N; amp_fft = abs(fft(amp))/N; phase_fft = angle(fft(phase))/pi*180; subplot(2,1,1); plot(freq,amp_fft); xlabel('Frequency (Hz)'); ylabel('Amplitude'); subplot(2,1,2); plot(freq,phase_fft); xlabel('Frequency (Hz)'); ylabel('Phase (degree)'); ``` 运行此代码,可以得到窄带随机过程的希尔伯特变换模和相角的频谱图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值