将正弦波信号转换为方波信号

信息处理 噪音 Python 转换
2022-01-27 05:58:52

我有一个包含数字 ASK 类型开关键控正弦波变化的信号,其中会出现一些随机不相关的谐波,如图所示: 原始信号

在目前的形式中,每个脉冲持续时间都是相同的,但情况并非总是如此。

我想计算每个脉冲持续时间。为此,我正在考虑将此信号转换为如下所示的方波信号:

预期信号

我不确定此转换所需的不同步骤,但我有一些线索:

  1. 去除噪音 => 我认为的低通滤波器?
  2. 为了使信号介于 0 和幅度之间,我将信号与自身相乘
  3. 我应用魔法滤波器将信号转换为方波信号。

所以我的问题是:

  • 我需要一个低通滤波器来消除噪音吗?
  • 我需要什么样的滤波器才能将信号转换为方波信号?是否可以?

有关信息,我正在使用 Python 和 Numpy。

如果有任何其他方法可以计算序列中每个脉冲的持续时间,我愿意接受所有想法。

谢谢!

编辑:这是我的信号:

   freq = 1000000
   fs = int(2*freq) # sample rate
   x = np.linspace(0, 10, fs)
   noise1 = 0.01*np.sin(2*np.pi * 1*x) + 0.05*np.sin(2*np.pi * 1.5*x) +     0.04*np.sin(2*np.pi * 0.2*x)
   noise2 = 0.1*np.sin(2*np.pi * 0.1*x) + 0.2*np.sin(2*np.pi * 1.8*x) + 0.1*np.sin(2*np.pi * 0.4*x)

  realSignal = 2*np.sin(2*np.pi * freq*x)
  sig =  noise1

  sig = np.append(sig, [realSignal, noise2, realSignal, noise1*noise2])
2个回答

您可以做的是使用窗口 RMS 函数处理此信号(我正在用 matlab 代码编写,但它可以很容易地用 python 翻译):

windowlength = 5; %you can change that, but keep it odd
hw = (windowlength-1)/2; %hw stands for "half window"
%pre-assigning the output RMS signal
sig_RMS = zeros(1,length(sig)); 
%I'm adding zeros the the signal's left and right for boundary calculation
sig_zero_padded = [zeros(hw,1), sig, zeros(hw,1)];

sig_zero_padded = sig_zero_padded.^2; %squaring the samples
for i=(hw+1):(length(sig_zero_padded)-hw)
   % calculating square-mean inside the window and assigning the result
   %to the appropriate sample in sig_RMS
  sig_RMS(i-hw) = sqrt(mean(sig_zero_padded(i-hw:i+hw)));
end

然后设置一个最小值,将 RMS 信号的上级值分配为 1,将另一个分配为 0:

trigger = 0.5; %I chose arbitrarily
square_sig = (sig_RMS > trigger);

你应该得到你的方形信号。

我们在这里所做的,用简单的语言来说,就是获取信号的一小部分并计算每一位的 RMS 值。如果该计算值足够显着以被视为“非噪声”,则我们为其分配“1”。

编辑:我设法计算它并且它有效。请注意,我必须采取Fs = 10^5,因为我的电脑没有足够的容量Fs = 10^6

这是信号(蓝色)和计算的 RMS 信号(红色)windowlength = 8191

在此处输入图像描述

然后我设置trigger = 0.4并获得了两个清晰的区域来识别有用的信号:

在此处输入图像描述

所以总而言之:

  1. 设置 windowlength 以获得足够远离噪声的 RMS 信号平均值,同时保持精度。在我的情况下,它大约是样本总数的 1%。
  2. 在 RMS 波峰和噪声之间设置触发

但是,我有一种感觉,我正在重新发明一些东西,所以请随意查找有关此方法的一些文献,我确信有人进行了数学运算以获得窗口长度和触发器的最佳值。;)

使用希尔伯特变换和阈值创建信号(解析信号)的包络。

import scipy.signal.signaltools as sigtool

env = numpy.abs(sigtool.hilbert(sig))
threshold = 1
square_sig = (env > threshold)

(我没有安装python ATM,所以我无法测试这个)