杂文笔记(三):CSI的线性相位去噪及其python实现

19 篇文章 18 订阅

1. CSI相位信息

  测量到的第i个子载波上的CSI相位信息 θ ~ i \tilde{\theta}_{i} θ~i
θ ~ i = θ i + 2 π K i Δ t N + β + Z f \tilde{\theta}_{i}=\theta_{i}+\frac{2 \pi K_{i} \Delta t}{N}+\beta+Z_{f} θ~i=θi+N2πKiΔt+β+Zf其中 θ i \theta_{i} θi为真实相位, Δ t \Delta t Δt为定时误差偏移(或者说时延), β \beta β是设备引起的随机相位偏移, Z f Z_{f} Zf是测量过程中的随机噪声。 K i K_{i} Ki是子载波索引(在IEEE 802.11n中范围是[-28,28]),N为FFT点数,N = 64.
在这里插入图片描述

2. 线性相位去噪(两步:解卷绕+线性变换)

目的:去除上式中中间两项。
  对于接收器,等式中间两项噪声在传输期间保持不变,线性相位去噪引入仅与真实相位相关,并对于每个子载波传输期间一致的变量值:
a = θ ~ n − θ ~ 1 K n − K 1 b = 1 n ∑ i = 1 n θ ~ i \begin{aligned} a &=\frac{\tilde{\theta}_{n}-\tilde{\theta}_{1}}{K_{n}-K_{1}} \\ b &=\frac{1}{n} \sum_{i=1}^{n} \tilde{\theta}_{i} \end{aligned} ab=KnK1θ~nθ~1=n1i=1nθ~i其中 θ ~ \tilde{\theta} θ~是原始相位,n一般为30,去噪后的相位为:
θ ^ i = θ ~ i − a k i − b = θ i − θ n − θ 1 K n − K 1 K i − ∑ i = 1 n θ i n \hat{\theta}_{i}=\tilde{\theta}_{i}-a k_{i}-b=\theta_{i}-\frac{\theta_{n}-\theta_{1}}{K_{n}-K_{1}} K i-\frac{\sum_{i=1}^{n} \theta_{i}}{n} θ^i=θ~iakib=θiKnK1θnθ1Kini=1nθi
由于采集的CSI信号周期范围为 [ − π , π ] [-\pi, \pi] [π,π],临界点π和π处会发生反相。为获得对应的30个子载波的均匀分布,在线性变换之前首先得unwrap30个子载波的相位
在这里插入图片描述
(a)原始相位→(b)接卷绕相位→(c)线性去噪后的估计相位

3. 相位校准效果

参考论文《PhaseFi: Phase Fingerprinting for Indoor Localization with a Deep Learning Approach》
在这里插入图片描述

4. CSI线性相位去噪的python实现

实验用的一发三收HT20,代码针对一发三收的数据流,是以前参照widar2.0相位去噪思路写的,感觉效果差不多

import numpy as np

pi = np.pi

# 注意,ant_csi的维度为1*F*T
def CSI_sanitization(one_csi, two_csi, three_csi):
    M = 3  # 天线数量3
    N = 30  # 子载波数目30
    T = one_csi.shape[1]  # 总包数
    fi = 312.5 * 2  # 子载波间隔312.5 * 2
    csi_phase = np.zeros((M, N, T))
    for t in range(T):  # 遍历时间戳上的CSI包,每根天线上都有30个子载波
        csi_phase[0, :, t] = np.unwrap(np.angle(one_csi[:, t]))
        csi_phase[1, :, t] = np.unwrap(csi_phase[0, :, t] + np.angle(two_csi[:, t] * np.conj(one_csi[:, t])))
        csi_phase[2, :, t] = np.unwrap(csi_phase[1, :, t] + np.angle(three_csi[:, t] * np.conj(two_csi[:, t])))
        ai = np.tile(2 * pi * fi * np.array(range(N)), M)
        bi = np.ones(M * N)
        ci = np.concatenate((csi_phase[0, :, t], csi_phase[1, :, t], csi_phase[2, :, t]))
        A = np.dot(ai, ai)
        B = np.dot(ai, bi)
        C = np.dot(bi, bi)
        D = np.dot(ai, ci)
        E = np.dot(bi, ci)
        rho_opt = (B * E - C * D) / (A * C - B ** 2)
        beta_opt = (B * D - A * E) / (A * C - B ** 2)
        temp = np.tile(np.array(range(N)), M).reshape(M, N)
        csi_phase[:, :, t] = csi_phase[:, :, t] + 2 * pi * fi * temp * rho_opt + beta_opt
    antennaPair_One = abs(one_csi) * np.exp(1j * csi_phase[0, :, :])
    antennaPair_Two = abs(two_csi) * np.exp(1j * csi_phase[1, :, :])
    antennaPair_Three = abs(three_csi) * np.exp(1j * csi_phase[2, :, :])
    return antennaPair_One, antennaPair_Two, antennaPair_Three

用采集的数据验证效果:
在这里插入图片描述
线性去噪后每条子载波上能比较真实得反映出真实相位的变化情况。

  • 13
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
### 回答1: Matlab振动信号去噪是指通过Matlab软件上的算法和工具,将带有噪声的振动信号处理成较为清晰的信号。振动信号是一种基于信号处理的方法,用于获取物理系统的振动特性,如频率、幅度和相位。但是,振动信号受到环境噪声和传感器噪声的影响,往往会失真和不连续。振动信号去噪是一种提高测量精度和信号处理效果的重要方法。 Matlab振动信号去噪的步骤如下: 1. 加载数据:将振动信号读入Matlab软件,并转换成数字信号。可以使用内置函数“load”或“readtable”等读取数据。 2. 预处理:对数据进行预处理,包括滤波、去趋势、归一化等,以减小噪声和偏差的影响。 3. 噪声识别:使用Matlab的频谱分析工具,如FFT转换、小波分析等方法,确认噪声的频率范围、幅度、强度等特征。 4. 去噪处理:在确认噪声特征后,使用Matlab的滤波工具或小波去噪算法等,去除噪声的影响。 5. 评估效果:使用Matlab的可视化工具,如波形绘制、频谱分析图和相位图等,评估去噪效果,并检查是否有失真或畸变。 综上所述,Matlab振动信号去噪是一种将受噪声干扰的振动信号处理成清晰信号的有效方法。通过预处理、噪声识别、去噪处理和效果评估等步骤,可以有效地降低信号的噪声和失真,提高测量精度和信号处理效果。 ### 回答2: 震动信号去噪是一项重要的任务,它能够帮助我们精确地获取有用的信号信息。MATLAB是一个非常适合进行信号处理的工具,它提供了许多功能强大的工具和函数,可以帮助我们有效地去除噪音,并提取所需信号。 在MATLAB中,处理振动信号的首要步骤是对原始信号进行分析和预处理。其中包括对信号进行采样率转换和去除直流分量等。然后,我们可以使用MATLAB内置的滤波函数,如Butterworth滤波器和高通、低通或带通滤波器,来去除信号中的噪音。 此外,MATLAB还提供了各种去噪算法,如小波阈值去噪、基于奇异值分解(SVD)的去噪方法、自适应滤波、Kalman滤波等。这些算法在不同的情况下具有不同的效果,我们可以根据不同的需求和信号特点来选择相应的算法。 总之,MATLAB提供了一组强大的工具和函数,可以帮助我们有效地去除振动信号中的噪音,并提取我们所需的信号,从而使我们能够更加准确地分析和预测系统动力学行为,为工程实践提供有力的支持。 ### 回答3: 振动信号是工程领域中常见的一种信号,但信号中常常存在噪声,这会对信号的准确分析和处理造成影响,因此去噪是非常有必要的。MATLAB是一款广泛应用于科学和工程计算的软件,具有强大的信号处理功能,在MATLAB中进行振动信号去噪可以选择以下几种方法: 1.基于小波变换的去噪方法。小波变换是当前信号处理领域中常用的一种方法。该方法可以将信号分解成多个频带,然后将不需要的噪声滤掉,最后再进行重构,得到去噪后的信号。MATLAB中提供了多种小波变换函数,如db1、db2等,可以方便地应用到振动信号去噪中。 2.基于分段平滑技术的去噪方法。该方法是将信号分段处理,对每一段信号进行平滑处理,将平滑后的信号拼接起来,得到去噪后的信号。MATLAB中可以使用butter函数或者sgolayfilt函数进行平滑处理。 3.基于自适应滤波法的去噪方法。该方法是根据信号的频谱特性进行滤波。在MATLAB中可以使用的函数有wiener2、imfilter等。 以上种方法都能够有效地对振动信号进行去噪处理。在具体应用时,需要根据信号的特点选择不同的方法,并根据实际情况对参数进行调整,以达到良好的去噪效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值