压缩感知的应用——电流电压采样

我是2010年读研究生的,那时候“压缩感知”很流行。我也曾对“压缩感知”进行过研究,比如图像的超分辨率重建。但是当时,基于压缩感知的图像超分辨率重建存在很多人工痕迹,与现在基于深度学习的超分辨率重建相比差距很大。

压缩感知(Compressed Sensing)是一种测量技术,它号称只要信号可以在某个域下被稀疏表示,就可以超越奈奎斯特采样定理,用远低于传统的采样频率来进行采样。

目前我的工作要对三相电流电压进行采样。要实现高精度采样,通常需要用高采样率。但是,高采样率会导致数据量增加,给数据存储和处理造成很大压力。特别是在需要长时间采样的情况下,传统方法可能存储不了这么多数据。还有,对于使用嵌入式设备进行边缘端采样的应用,嵌入式设备的存储空间本来就有限,这一问题就更严重了。

压缩感知理论为解决这一问题提供了一种有效的方案。通过利用信号在频域的稀疏性,压缩感知理论可以实现较低采样率下的信号重构。经过测试,利用压缩感知方法可以利用10%的数据就能重建出原始信号。也就是说,如果存储空间仅支持高频采样100秒,利用压缩感知技术可以将采样时间提高到1000秒。

我尝试写了一段代码来验证这个想法:

import numpy as np
import pandas as pd
import scipy.fftpack as spfft
import matplotlib.pyplot as plt
import cvxpy as cvx


FILE_NAME = 'xxx.csv'

def load_csv(filename: str) -> pd.DataFrame:
    df = pd.read_csv(filename, index_col='index')
    df["u_a"] = df["u_a"]
    df["u_b"] = df["u_b"]
    return df


def compressed_sensing(t: np.ndarray, y: np.ndarray):
    n = len(y)
    print(f"x dimension: {len(y)}")
    plt.plot(t, y)
    plt.title('original')
    plt.show()

    yt = spfft.dct(y, norm='ortho')
    # extract small sample of signal
    sample_n = n // 10  # 10% sample
    ri = np.random.choice(n, sample_n, replace=False) # random sample of indices
    ri.sort()
    t2 = t[ri]
    y2 = y[ri]

    plt.plot(t, y)
    plt.plot(t2, y2, 'r.')
    plt.title('10% sample')
    plt.show()

    # create idct matrix operator
    A = spfft.idct(np.identity(n), norm='ortho', axis=0)
    A = A[ri]

    # do L1 optimization
    vx = cvx.Variable(n)
    objective = cvx.Minimize(cvx.norm(vx, 1))
    constraints = [A*vx == y2]
    prob = cvx.Problem(objective, constraints)
    result = prob.solve(verbose=True)

    # reconstruct signal
    x = np.array(vx.value)
    x = np.squeeze(x)
    sig = spfft.idct(x, norm='ortho', axis=0)

    plt.plot(t, y)
    plt.plot(t, sig, 'r-')
    plt.title('reconstructed signal from 10% sampled data')
    plt.show()


def main():
    df = load_csv(FILE_NAME)
    compressed_sensing(df.index.values/1000, df['i_a'].values)


if __name__ == "__main__":
    main()

可以看到,我使用的采样矩阵为一个伪随机的矩阵。这在真实的采样中,是可以实现的。

10%采样

完整的代码放在了我的github中:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值