0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

超声流量传感器—相位差和信号相关性原理解析

安费诺传感器学堂 来源:安费诺传感器学堂 2024-04-29 10:37 次阅读

1. 引言

之前我们简单介绍了基于差压的流量传感器,这次我们要开始基于超声的流量计。超声流量计是一种测量液体或气体流量的仪器,其工作原理基于超声波在介质中传播的特性。这种流量计可以在无需接触或干扰流体本身的情况下进行测量,因此被广泛应用于各种工业环境,尤其是在需要无接触或无损测量的场合。

超声流量计的应用领域非常广泛,从水处理和污水处理设施,到化工和石油行业,再到食品和饮料生产线。这些设备还在航空、电力和热力行业中发挥着关键作用,帮助这些行业的专业人士监控系统的效率,评估设备的性能,以及确保工艺流程的连续性。

此外,超声流量计还在医疗领域有着重要应用。例如,医护人员可以利用超声流量计监测血液或药物的输送速度,对心血管疾病的诊断和治疗中起到关键作用。 而今,随着科技的不断发展,超声流量计的准确性和可靠性得到了大幅提升,让我们能够在不同的场景和环境中,对流体流动有着更精确的控制和理解。

2. 相关性原理

相关性是一个统计学术语,用来描述两个或多个随机变量之间的统计关系。在信号处理中,原则上这个关系也可以不必非要是线性的,相关性分析也可以衡量两个信号的非线性关系。 相关性的计算通常通过相关系数(Pearson相关系数为最常用的一种)来实现。

相关系数的值范围在-1到1之间,0表示两个变量独立无关,-1表示两个变量完全负相关,1表示两个变量完全正相关。 在信号处理中,通常会用到互相关(Cross-Correlation)函数,它是对两个信号的相似性进行度量。这在很多应用中非常有用,比如在无线通信中的信号识别,图像处理中的模式匹配,以及地球物理勘探中地震波的分析等。

计算互相关函数的公式为:

c550094c-05d0-11ef-a297-92fbcf53809c.png

其中,x和y分别为两个信号,Rxy(t)为在延时 t 时的互相关值。 在离散时间序列中,可以用求和代替积分进行计算。 c55752e2-05d0-11ef-a297-92fbcf53809c.png

其中,l>=0时,i=l,k=0,并且l<0时,i=0,k=l。

以上公式中,t和l表示时间的移位;下标xy的顺序,表示一个变量或序列相对于留一个变量或序列的移位方向:上面两个等式中,变量x或者序列x(n)未移动,而y或者y(n)在时间上移动了t或l个单位:向右移动则t或l为正;向左移动则t或l为负。

数据相关性分析对于有加性噪声的信号分析有其独到的特点。

举现成的栗子[1]:

c56c7be0-05d0-11ef-a297-92fbcf53809c.pngc57d1950-05d0-11ef-a297-92fbcf53809c.png

c58a30ea-05d0-11ef-a297-92fbcf53809c.png

图-1加性噪声下的周期信号

这里x(n)(红色部分正弦线条)是一个周期性的序列,周期N未知,ω(n)表示随机噪声,蓝灰色信号线为y(n)=x(n)+ω(n)。我们怎么去了解该带噪声信号y(n)的周期?[1](这里省掉了对于周期信号相关性计算特点的陈述)

c5a47aea-05d0-11ef-a297-92fbcf53809c.png

尽管小编也很想花些篇幅来说明相关性应用的特点,限于篇幅,我们对于上面的周期为N的信号自相关的结果中,Rxx在l=0,N和2N等处有相对较大的峰值;信号x(n)和加性噪声ω(n)的互相关Rxω和Rωx相对很小;而随机噪声信号的自相关Rωω序列,除了在l=0处有峰值外(每个对应点自相乘后累加),其余点将很快衰减到0。 这里忘了说明:周期信号的自相关序列也是一个同周期的序列。也就是如下公式所示的周期为N的序列x(n)自相关[1]:

c5bf2cb4-05d0-11ef-a297-92fbcf53809c.png

在这种情况下,我们计算y(n)的自相关序列后,可以得到噪声淹没下的周期,如下的图示的每2个红点之间的时间所代表的周期结果: 噪声下的周期信号的相关性周期检查演示代码如下所示:

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks


# 创建一个正弦信号
T = 1/50 # 50Hz信号,周期为1/50,这里实际设置为0.02秒
fs = 5000 # 抽样频率
t = np.arange(0, 1, 1/fs) # 持续时间为1秒
signal = np.sin(2 * np.pi * 50 * t)


# 添加噪声
noise = np.random.normal(0, 2, signal.shape)
noisy_signal = signal + noise


# 计算信噪比SNR,以dB表示
SNR = 10 * np.log10(np.mean(signal**2) / np.mean(noise**2))
print('SNR: {:.2f} dB'.format(SNR))


# 计算并显示带噪声的正弦波和清洁的正弦波
plt.figure(figsize=(12, 8))
plt.subplot(2, 1, 1)
plt.plot(t, noisy_signal, label='Noisy signal')
plt.plot(t, signal, 'r', label='Original signal')
plt.legend(loc='upper right')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.title('Noisy and Original Signal')


# 计算自相关函数
auto_corr = np.correlate(noisy_signal, noisy_signal, mode='full')
# 找到自相关函数的峰值检查阈值[max()/12]来估计周期
auto_corr = auto_corr[auto_corr.size // 2:]     #取相关信号结果的后半截数据
peaks, _ = find_peaks(auto_corr, height=auto_corr.max()/12, distance=fs/60) # 最小距离设置为一个频率60Hz的周期
estimated_period = np.diff(peaks) / fs
print('Estimated period: {:.2f} s'.format(estimated_period.mean()))


# 绘制自相关函数并显示峰值
plt.subplot(2, 1, 2)
plt.plot(t, auto_corr / fs, 'g') # 除以fs以便时间以秒为单位
plt.plot(peaks / fs, auto_corr[peaks] / fs, 'ro')
plt.xlabel('Time delay [s]')
plt.ylabel('Autocorrelation function')
plt.title('Autocorrelation of Noisy Signal')
plt.tight_layout()
plt.show()
运行测试可以得到正确的结果:Estimated period: 0.02 s

c5cef752-05d0-11ef-a297-92fbcf53809c.png

图-2周期信号通过相关性序列的周期检测

计算互相关函数需要注意以下几点:

相关并不表示因果关系。即使两变量存在高度相关,也只能表明它们之间存在某种关系,但并不能确定是哪个变量影响了另一个变量。

为了准确计算互相关函数,关键在于灵敏地选择合适的时延值。合适的时延值取决于所考虑系统的特性及其应用。

对于非平稳信号(信号的统计特性会随着时间变化),可能需要使用互相关函数的改进版,如互协方差函数等。

需要注意,互相关函数对噪声非常敏感,信号的噪声会直接影响到相关运算的结果,因此在进行相关运算之前,通常需要对信号进行去噪处理。

计算复杂度高,尤其是数据量大的时候。对于大数据集,可采用快速傅里叶变换(FFT)进行降维计算。FFT算法的时间复杂度为O(NlogN),而直接在时域计算互相关函数的时间复杂度则是O(N^2)。

3. 超声波流量计中的相关性原理的应用

c5ec2494-05d0-11ef-a297-92fbcf53809c.png

图-3超声流量计的配置图

要开启对超声流量计工作原理的讨论,关键在于理解超声波在流体中传播的特性以及两者之间如何互动。 超声流量计采用了所谓的“TOF-时间飞逝”方法进行测量。超声收发的配置会存在差异。假设在这种设备中,有两对超声换能器A和B,按照上图所示被置于管道的两侧,都是向下发射,下面的接收。当没有流体流过的时候,从一个传感器发出的超声波到达另一个传感器所需的时间应该是恒定的。

然后,当流体开始流过时,这个时间将会发生变化。 超声波流量计的构造有很多种类,简单以上面的图-3所示。具体来说,当流体如图示的方向流动时,从A发出的超声波会被流体带着一起移动,所以它到达接收端的时间t2会少于没有流体流动的情况。

反之,从B发出的超声波在到达接收端的过程中需要逆流而上,所以耗费的时间t1会更多。 在流量计内部,这两个时间被用来计算出一种称为“时间差”的值delay,这就是流体流速的直接度量参数。根据这个delay所对应的时间来计算流速的公式见3.2段。 然后,通过对管道的直径和流速的测量,便可以计算出流量。不过是基于单纯TOF时差的方式,在实际应用中,超声信号可能会受到各种类型噪声的干扰。

如果信号受到过多的干扰,将无法正确测定时差。为了获取准确的流速读数,我们需要尽量消除这些噪声带来的影响。 既然我们看到了相关性对于噪声影响的抵消能力,我们就此引出利用信号的相关性进行流速测量的思路方法。本文不是重点于如何设计,而是提供一种解决问题的思路。

3.1 使用相关性检测相位差法的超声流量计的处理大致步骤

超声波发射:超声波流量计中的超声换能器发出的超声波通常会以一定的角度,被发射到流体中。精准记录发射、接收时间是进行相关性分析的一个基本要素。

接收信号:流量计中的两个超声接收器会分别接收顺流和逆流的超声波信号。由于流速的原因,这两个信号从各自的发射到接收之间,会有一定的时间差。如果不考虑多普勒频移,接收到的两组信号可以认为是同频及波形相似的。

对收到的信号进行预处理:包括但不限于降噪、滤波等。

计算相关性:将接收到的两个信号进行相关性计算,得到相关函数。相关函数的峰值表示两个信号最相关(也就是最相似)的位置以及所表示的相位差。

计算相位差:根据计算相关性序列中得到的对应时序,得到所代表的两信号间在波形上的相位差。而经过给定的参数条件,即可获取两组信号在接收时的时间差。

计算流速:通过已知的声速,路径长度,以及由相位差得到的时延,本质上也是通过计算TOF的差异,再得到流速。一般可以假定流体为无损耗的流体,流体的湍流程度对测量结果影响可以根据实际情况调整算法。一定要注意:温度对于声速在流体中的影响是明显的,实际应用中一定要处理好温度对于流量计算的补偿。

计算流量:最后,利用流速和管道断面积的信息,可以得到流体的体积流量,即通过管道的流体体积与时间的比值:Q=Av (A为管道横截面积,v为流速),本文在计算得到流速后,统一不再计算流量。

以上就是使用相关性检测相位差法的超声流量计的基本处理步骤。需要注意的是,这只是大致步骤,每一步可能会根据具体实现,使用的硬件设备以及信号处理方法的不同而有所差异。

3.2 使用相关性检测相位差法的超声流量计的仿真

依旧参考前面的构造图,并且设定一些已知条件(比如管径,流体的声速—温度暂不考虑,流速,超声换能器的安装角,超声波的驱动频率,信号的采样频率等)来看模拟的结果和给定的已知参数是否相近或者相等。这里我们以给定的流速和模拟测量结果中的流速为比较。

在以下的模拟过程中,两路信号各自的生成采集起始时间是需要尽可能准确记录,这样,我们以其中的一路为信号为相关性处理的相对基准序列时,在存在流速的情况下,另外一路和该路信号中间就存在相位差。

c60ac142-05d0-11ef-a297-92fbcf53809c.png

c55752e2-05d0-11ef-a297-92fbcf53809c.png

在计算所得的相关性序列数据中,找到相关数值Rxy最大值所对应的时间“l”——在波形上是相位——就找到了两组信号的相位差,亦即时间差。以上接收信号序列中的每个标识,意味着一次数据采集的结果——后文会提到:数据的采样频率,也会影响计算的精度。

在这里,两路接收信号之间的相位差,就是我们要相关性处理测量计算的中间变量。整个模拟过程中,我们按照之前的分析,暂时忽略由于流速导致的多普勒频偏的影响。根据信号的相位差得到时差后,换算成流速的公式如下:

c6232926-05d0-11ef-a297-92fbcf53809c.png

无噪声情况下的模拟

由以下条件生成的模拟信号,然后看看通过信号的处理是否可以还原流体的流速。

c = 4500 # 流体中的声速 m/s

d = 0.5 # 管径(m)

θ= math.pi / 6 # 超声换能器的安装角,30 deg.

L = d / math.cos(theta) # 理想情况下的声音传播路径长(m)

v = 4 # 流体流速(m/s)-用于生成模拟信号,也是待比较值

f = 1e6 # 超声波的驱动频率 1MHz

T = 1 / f # 驱动频率的周期时间(s)

Fs = 125e6 # 采样频率为125MHz

Ts = 1/Fs # 采样间隔

c6307d42-05d0-11ef-a297-92fbcf53809c.png

图-4无噪声正弦信号的相关性检测

仿真的结果如下:

Length of t lags: 2497

Length of t serial: 1249

Ts Delayed cycles: 14

Delayed time: 1.1208967173738991e-07s

shift degree: 40.352281825460366

Sample time interval: 8.00640512409928e-09s

Estimated velocity: 3.9314356314212877(m/s)

可以看到,通过模拟信号进行相关性处理之后得到的流体速度计算结果,和模拟信号中设定的“实际”流速很接近,仅1.71%的误差。

如果接收信号的幅值不一样会有什么影响?我们来模拟一下:两个超声换能器接收到的信号乃至放大之后采集到的信号仍然存在不一致时,对测量结果是否会有影响?

下图中信号#2的幅值已经是信号#1幅值的2倍了。

c6495038-05d0-11ef-a297-92fbcf53809c.png

图-5幅值不同的两个正弦信号的相关性检测

我们看到,接收信号的幅值不一样的情况下,测量所得的流速和前面信号同幅值时是一样的。可见理想情况下,幅值对测量值影响不是首位的,但是实际应用中肯定存在噪声,而有噪声我们就需要强调信噪比,因此虽然模拟结果尚可,但是信号的有效幅值我们还是希望更高些。

Estimated velocity: 3.9314356314212877(m/s)

有噪声情况下的模拟

信噪比是随便选的,但是我们可以看到在有噪声的影响下,单纯使用时差检测的方法将无法再检测时,通过信号序列的相关性处理,仍然可以有相应的输出。我们将两路信号加上各自幅值的0.5倍的随机噪声。

c65c4256-05d0-11ef-a297-92fbcf53809c.png

图-6带加性噪声的两个正弦信号的相关性检测

虽然可以检测,但是此时得到的结果是4.77m/s,和理想模拟值流速=4m/s有了较大差异。

Length of t lags: 2497

Length of t serial: 1249

Ts Delayed cycles: 17

Delayed time: 1.3610888710968775e-07

degree: 48.9991993594876

Sample time interval: 8.00640512409928e-09

Estimated velocity: 4.773885690505651(m/s)

可见,噪声将影响测量的精度。如果我们在设计硬件过程中,已经充分考虑了信号的收发部分的滤波处理,也将非常有利于最后测量值的精度和稳定性。关于信号滤波这部分,在稍后也需要用到。

以下是上面模拟有、无噪声信号处理所用的python代码,仅供参考。代码中在生成的信号中添加了随机噪声,不需要时请注释掉。

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import correlate
import math


def cor_demo():
    try:
        # Parameters
        c = 4500    # Sound speed in the fluid in m/s
        d = 0.5     # Pipe diameter in meters
        theta = math.pi / 6     # Angle of the emitted ultrasound wave, in radians. 30 degrees here.
        L = d / math.cos(theta) # The sound path length in meters parallel to the flow direction
        v = 4                   # Fluid velocity in m/s


        f = 1e6     # Frequency of the signal in 1MHz
        T = 1 / f   # Period of the signal in s


        Fs = 125e6 # 采样频率为125MHz
        Ts = 1/Fs  # 采样间隔
        
        # Calculate time delay caused by flow velocity
        time_up = L / (c - v * math.sin(theta)) # Time of flight upstream
        time_down = L / (c + v * math.sin(theta)) # Time of flight downstream
        
        #t_delay = L / c * (1 / np.sqrt(1 - (v / c * np.sin(theta)) ** 2) - 1)
        print("T1_0:",time_up-time_down)
        t_delay = 2 * L * v * np.sin(theta) / (c**2 - v**2 * np.sin(theta)**2)
        
        # Time array
        # 返回一个从0到period*T范围内的有num_samples个元素的一维数组,数组中的数值是等间距分布的
        period = 10
        num_samples = period*T/Ts
        t = np.linspace(0, period*T, int(num_samples))


        # Signals
        s0 = np.sin(2 * np.pi * f * t)
        s1 = np.sin(2 * np.pi * f * (t - t_delay))  #*2.0 # Signal 1


        #=====添加噪声:mask this seg to remove noise from signals=========
        noise0 = np.random.normal(0, 0.5, s0.shape)
        noise1 = np.random.normal(0, 0.5, s1.shape)
        
        s0 = s0 + noise0
        s1 = s1 + noise1
        #=====mask the seg above to remove noise from signals=========


        # 计算Cross-correlation,并找到最大值对应的位置
        correlation = correlate(s1, s0, method='direct', mode='full')
        lags = np.arange(-len(s1) + 1, len(s1)) # Lags array
        print("Length of t lags:", len(lags))
        # Calculate flow speed using the estimated time delay
        # Find the peak of the cross-correlation corresponds to the time delay
        print("Length of t serial:", len(t))
        delay = lags[np.argmax(correlation)]            # 相位差所对应的信号序列值
        
        sample_time = (period*T) / len(t)               # 采样间隔时间
        time_delay = delay * sample_time                # 两个信号间的延迟时间
        
        phase_shift = (time_delay / T) * 2 * np.pi      # 由时间延迟换算成的两个信号序列的相位差
        phase_shift_deg = phase_shift * (180 / np.pi)   # 由相位差换成的两个信号序列的角度差
        print("Ts Delayed cycles:", delay, ", Delayed time: ", time_delay, "degree:", phase_shift_deg) # 将延迟转换为相位差
        print("Sample time interval:",sample_time)
        # 计算所得的流速
        v_estimated = (math.sqrt((L**2)+(time_delay**2)*(c**2))-L)/(time_delay * math.sin(theta))
        print('Estimated velocity: ', v_estimated)


        # 画图
        #fig, (ax_origin, ax_corr, ax_shift) = plt.subplots(2, 1, figsize=(12, 8))
        fig, (ax_origin, ax_corr) = plt.subplots(2, 1, figsize=(12, 8))


        # 原始信号图
        ax_origin.plot(t, s0, label='Signal 1')
        ax_origin.plot(t, s1, label='Signal 2')
        ax_origin.set_title('Original signals')
        ax_origin.legend()


        # 互相关图
        ax_corr.plot(correlation)
        ax_corr.axvline(x = len(correlation)//2 + delay, color = 'r', linestyle = '--', label = "Max correlation at delay")
        ax_corr.set_title('Cross-correlation between signal 1 and signal 2')
        ax_corr.legend()


        plt.tight_layout()
        plt.show()
        return
    except Exception as e:
        print("Error:",e)


if __name__=='__main__':
    cor_demo()
4.超声波流量计中的信号相关性处理中的插值处理

需要了解的是,在信号采集过程中,足够快的采样率是保证相位差有足够分辨率的保证。对应的是模拟代码中“Ts Delayed cycles”。容易设想,如果我们可以在处理器足够快的前提下,还可以得到更多的“Ts Delayed cycles”,就意味着相位差的分辨率就可以足够高。

在上面的模拟过程中,DAQ的采样频率是125MHz,对应一些高速ADC器件。反之呢?如果实际使用的ADC器件的采样率因为某些原因速度并不是那么高时,我们的模拟结果会出现什么情况?

下面的波形是将ADC的采样频率调整为12.5MHz时的输出。

c687951e-05d0-11ef-a297-92fbcf53809c.png

图-7降低信号采集频率后的相关性检测

采集到的波形来看,正弦波已经有点异常了。从模拟结果来看,即使是其他都是理想的情况下,流速结果和4m/s的设定相差就很多了。

Estimated velocity: 2.828550434230693(m/s)——插值前

在这种情况下,有无其他的方式提高最后输出结果的精度?答案是肯定的,那就是插值——我们已经设定这个波形是近正余弦的,在python中,我们看到软件包scipy有3阶样条插值的实现方式函数:scipy.interpolate.interp1d。以下的仿真结果就是基于该插值方式实现的。 插值的过程,就是在已有的时间序列中,每个间隔之间均匀地插入设定的时间点数,然后通过插值函数,在已采集的信号(这里是模拟的采集信号)中,对应插入的时间点上,使用3阶样条插值,添加额外的插值。

c6b54220-05d0-11ef-a297-92fbcf53809c.png

图-8插值法提高相关性检测精度的输出

上图是通过插值方法得到的输出图。第一个图,是没有插值时的2路信号输出图,该图和前一个图中的信号波形是一致的,都是基于12.5MHz的采样率生成的。第二个图和第三个图,就是在12.5MHz采样率的采集信号的前提下插值得到的。这里每两个源数据之间插入点数有10个,实际应用过程中,应该需要充分考虑处理器的处理速度,流量测量的实时性要求。

Estimated velocity: 3.959970232994945m/s——插值后 得到的模拟流速测量结果也是很接近设定的模拟流速(4m/s)的。并且,其中的数据点,有原先的247个,经过插值后,达到2479个,相对于增加了分辨率。

需要特别提出,信号的完整性在这里是重要的,滤波!否则插值的结果也将是乱七八糟的。如下图,直接在噪声叠加的信号上进行插值。模拟结果也测试了,不尽如人意,和设定值相差较大。大家可以用本文附带的代码进行验证测试一下。

c6dbc120-05d0-11ef-a297-92fbcf53809c.png

图-9带噪声未滤波情况下的插值后相关性检测输出

插值运算相位差和流速。下面是模拟代码,仅供参考。以下代码中,噪声部分是注释掉的。

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import correlate
import math
from scipy.interpolate import interp1d


def cor_demo():
    try:
        # Parameters
        c = 4500    # Sound speed in the fluid in m/s
        d = 0.5     # Pipe diameter in meters
        theta = math.pi / 6     # Angle of the emitted ultrasound wave, in radians. 30 degrees here.
        L = d / math.cos(theta) # The sound path length in meters parallel to the flow direction
        v = 4                   # Fluid velocity in m/s


        f = 1e6     # Frequency of the signal in 1MHz
        T = 1 / f   # Period of the signal in s


        Fs = 125e5 # 采样频率为12.5MHz
        Ts = 1/Fs  # 采样间隔
        
        # Calculate time delay caused by flow velocity
        time_up = L / (c - v * math.sin(theta)) # Time of flight upstream
        time_down = L / (c + v * math.sin(theta)) # Time of flight downstream
        
        #t_delay = L / c * (1 / np.sqrt(1 - (v / c * np.sin(theta)) ** 2) - 1)
        print("T1_0:",time_up-time_down)
        t_delay = 2 * L * v * np.sin(theta) / (c**2 - v**2 * np.sin(theta)**2)
        
        # Time array
        # 返回一个从0到period*T范围内的有num_samples个元素的一维数组,数组中的数值是等间距分布的
        period = 10
        num_samples = period*T/Ts
        t = np.linspace(0, period*T, int(num_samples))


        # Signals
        s0 = np.sin(2 * np.pi * f * t)
        s1 = np.sin(2 * np.pi * f * (t - t_delay))  #*2.0 # Signal 1
        """
        noise0 = np.random.normal(0, 0.5, s0.shape)
        noise1 = np.random.normal(0, 0.5, s1.shape)
        
        s0 = s0 + noise0
        s1 = s1 + noise1
        """
        # Define interpolation factor
        interp_factor = 10


        # New time vector after interpolation
        t_new = np.linspace(t.min(), t.max(), t.size * interp_factor)
        
        # Create a function based on the original signals, which can be used to generate the interpolated signals
        interp_func_s0 = interp1d(t, s0, kind='cubic')
        interp_func_s1 = interp1d(t, s1, kind='cubic')


        # Generate the interpolated signals
        s0_new = interp_func_s0(t_new)
        s1_new = interp_func_s1(t_new)


        # 计算Cross-correlation,并找到最大值对应的位置
        #correlation = correlate(s1, s0, method='direct', mode='full')  # old
        correlation = correlate(s1_new, s0_new, method='direct', mode='full')
        lags = np.arange(-len(s1_new) + 1, len(s1_new)) # Lags array
        print("Length of t lags:", len(lags))
        # Calculate flow speed using the estimated time delay
        # Find the peak of the cross-correlation corresponds to the time delay
        #print("Length of t serial:", len(t))
        delay = lags[np.argmax(correlation)]            # 相位差所对应的信号序列值
        
        #sample_time = (period*T) / len(t)               # 采样间隔时间  old
        sample_time = (period*T) / len(t_new)
        
        time_delay = delay * sample_time                # 两个信号间的延迟时间
        
        phase_shift = (time_delay / T) * 2 * np.pi      # 由时间延迟换算成的两个信号序列的相位差
        phase_shift_deg = phase_shift * (180 / np.pi)   # 由相位差换成的两个信号序列的角度差
        
        print("Ts Delayed cycles:", delay, ", Delayed time: ", time_delay, "degree:", phase_shift_deg) # 将延迟转换为相位差
        print("Sample time interval:",sample_time)
        # 计算所得的流速
        v_estimated = (math.sqrt((L**2)+(time_delay**2)*(c**2))-L)/(time_delay * math.sin(theta))
        print('Estimated velocity: ', v_estimated)


        # 画图
        #fig, (ax_origin, ax_corr, ax_shift) = plt.subplots(2, 1, figsize=(12, 8))
        fig, (ax_origin, ax_interpo, ax_corr) = plt.subplots(3, 1, figsize=(12, 8))


        # 原始信号图
        ax_origin.plot(t, s0, label='Signal 1')
        ax_origin.plot(t, s1, label='Signal 2')
        ax_origin.set_title('Original signals')
        ax_origin.legend()


        # 插值后的信号图
        ax_interpo.plot(t_new, s0_new, label='Signal 1')
        ax_interpo.plot(t_new, s1_new, label='Signal 2')
        ax_interpo.set_title('interpolated signals')
        ax_interpo.legend()
        # 互相关图
        ax_corr.plot(correlation)
        ax_corr.axvline(x = len(correlation)//2 + delay, color = 'r', linestyle = '--', label = "Max correlation at delay")
        ax_corr.set_title('Cross-correlation between signal 1 and signal 2')
        ax_corr.legend()


        plt.tight_layout()
        plt.show()
        return
    except Exception as e:
        print("Error:",e)


if __name__=='__main__':
    cor_demo()

另外一个大家可以尝试比较的是:根据奈奎斯特采样定理,信号的采集频率至少应该是被采集信号带宽的2倍以上,才可以从采集信号中回复原信号。是不是还可以再降低一些采样频率然后通过插值的方式来提高测量精度呢?

5.小结

本文中提高的模拟信号及分析方式仅供理论参考,实际的超声接收信号不会是图示中的那样都是完美的正余弦波形。

超声流量计通过利用超声波在流体中传播的特性来测量流量,其中使用相位差方式是一种常见的方法。它的特点主要包括:

非接触测量:通过在管道外壁上安装超声探头,可以避免对流体产生任何影响,适合处理易激发、高温或腐蚀性的流体。

高精度:相位差法可以实现较高的测量精度,因为它直接测量的是流体的流动速度,而非其他的,可能受到流体性质变化影响的参数。

广泛适用:适用于各种类型的流体,包括气体、液体和蒸汽,并且管道大小范围广泛。

然而,在使用超声流量计时,我们需要注意以下可能影响测量精度的问题:

流体的温度、压力和流速状态变化:这些因素可能影响超声波在流体中的传播速度,从而影响测量结果,尤其是温度对于超声波在液体中的传播速度的影响。

超声探头的安装位置和角度:如果探头的安装位置或角度不准确,会导致超声波不能正确地穿过流体,影响测量结果。

管道和流体的不同:如果流体的性质(如粘度、密度)或者管道的材料和状况发生变化,可能需要重新校准设备。

流体中的颗粒或气泡:这些可能会吸收、散射或者反射超声波,从而影响信号质量。

以上并未考虑由于流速引起的多普勒频移影响。

以上都是在使用超声流量计时应注意的问题,以确保测量的准确性。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 流量传感器
    +关注

    关注

    1

    文章

    180

    浏览量

    22113
  • 无线通信
    +关注

    关注

    58

    文章

    4484

    浏览量

    143324
  • 信噪比
    +关注

    关注

    3

    文章

    251

    浏览量

    28546
  • 超声流量计
    +关注

    关注

    0

    文章

    10

    浏览量

    6890

原文标题:流量传感器(2)超声流量传感器—相位差和信号相关性原理

文章出处:【微信号:安费诺传感器学堂,微信公众号:安费诺传感器学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    相位差测量与虚拟相位差

    本帖最后由 eehome 于 2013-1-5 09:54 编辑 相位差测量与虚拟相位差计---相关资料
    发表于 05-08 17:30

    使用相关性测量相位差

    相位。测量的精度很大程度上取决于示波器的噪声和触发不确定性。图1.使用定时标记可以测量两个信号之间的相位差。传统上,Lissajous模式(图2)已用于测量两个正弦波之间的
    发表于 09-14 21:03

    相位差测量电路

    相位差测量电路
    发表于 02-10 09:09 8133次阅读
    <b class='flag-5'>相位差</b>测量电路

    信号相位差输出电路

    信号相位差输出电路
    发表于 04-21 21:14 1183次阅读
    <b class='flag-5'>信号</b><b class='flag-5'>相位差</b>输出电路

    2信号相位差输出电路图

    2信号相位差输出电路图
    发表于 07-09 11:52 993次阅读
    2<b class='flag-5'>信号</b><b class='flag-5'>相位差</b>输出电路图

    对于电容、电感产生的相位差该如何理解

    对于正弦信号,流过一个元器件的电流和其两端的电压,它们的相位不一定是相同的。这种相位差是如何产生的呢?这种知识非常重要,因为不仅放大器、自激振荡的反馈
    发表于 06-14 11:25 6446次阅读
    对于电容、电感产生的<b class='flag-5'>相位差</b>该如何<b class='flag-5'>理解</b>

    简易数显式工频信号相位差测量仪的详细资料说明

    相位差是工业测控领域经常需要测量的参数,如电力系统中功率因数的测量、铁路系统中相敏轨道电路相位差的测量以及科氏质量流量计中的相位差测量等等。而相位差
    发表于 06-02 08:00 7次下载
    简易数显式工频<b class='flag-5'>信号</b><b class='flag-5'>相位差</b>测量仪的详细资料说明

    详解电容、电感的相位差是如何产生的

    对于正弦信号,流过一个元器件的电流和其两端的电压,它们的相位不一定是相同的。这种相位差是如何产生的呢?这种知识非常重要,因为不仅放大器、自激振荡的反馈
    的头像 发表于 12-07 09:40 2443次阅读

    发射信号与接收信号之间的相位差如何计算

    该磁场在接收线圈感应用电动势,并通过调理电路处理,最终得到电压信号送入处理,计算得到待测物导致的发射信号与接收信号之间的相位差
    的头像 发表于 07-25 11:23 2843次阅读

    FFT相位差

    ⽤⼀种全相位FFT谱分析⽅法替代传统FFT测量相位差,其泄漏的衰减分贝数减⼩1半,精度⾄少提⾼1被。⽅法与前⾯的⽅法⼀样。全相位FFT测量相位的具体操作过程全
    发表于 12-06 20:45 16次下载

    如何理解电容、电感产生的相位差

    对于正弦信号,流过一个元器件的电流和其两端的电压,它们的相位不一定是相同的。这种相位差是如何产生的呢?这种知识非常重要,因为不仅放大器、自激振荡的反馈
    的头像 发表于 07-06 09:31 958次阅读
    如何<b class='flag-5'>理解</b>电容、电感产生的<b class='flag-5'>相位差</b>

    RC电路中相位差是如何引起的?电路中的相位差与哪些因素有关?

    RC电路中相位差是如何引起的?电路中的相位差与哪些因素有关? RC电路中的相位差是由电容和电阻的不同特性所引起的。在RC电路中,电容器和电阻的响应时间不同,导致
    的头像 发表于 11-21 16:00 3385次阅读

    如何减小电流互感相位差

    如何减小电流互感相位差 电流互感是一种用于测量电流的传感器。在实际应用中,由于各种因素的影响,电流互感往往存在
    的头像 发表于 12-20 14:43 1086次阅读

    超声流量传感器信号采样率的影响

    我们在之前在《流量传感器(2)—超声流量传感器相位差相关
    的头像 发表于 06-13 10:18 378次阅读
    <b class='flag-5'>超声</b><b class='flag-5'>流量</b><b class='flag-5'>传感器</b><b class='flag-5'>信号</b>采样率的影响

    使用泰克示波器观察相位差

    一、相位差的定义与意义 相位差是指两个相同频率的波形之间的相位差异。在实际应用中,相位差是一个重要的参数,它可以反映两个信号之间的时序关系,
    的头像 发表于 08-22 16:25 407次阅读
    使用泰克示波器观察<b class='flag-5'>相位差</b>