流量传感器(2)—超声流量传感器,相位差和相关性原理

首页02312    应用文档    流量传感器(2)—超声流量传感器,相位差和相关性原理

原文PDF下载

1. 引言


 

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

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

此外,超声流量计还在医疗领域有着重要应用。例如,医护人员可以利用超声流量计监测血液或药物的输送速度,对心血管疾病的诊断和治疗中起到关键作用。

而今,随着科技的不断发展,超声流量计的准确性和可靠性得到了大幅提升,让我们能够在不同的场景和环境中,对流体流动有着更精确的控制和理解。

 

2. 相关性原理


相关性是一个统计学术语,用来描述两个或多个随机变量之间的统计关系。在信号处理中,原则上这个关系也可以不必非要是线性的,相关性分析也可以衡量两个信号的非线性关系。

相关性的计算通常通过相关系数(Pearson相关系数为最常用的一种)来实现。相关系数的值范围在-1到1之间,0表示两个变量独立无关,-1表示两个变量完全负相关,1表示两个变量完全正相关。

在信号处理中,通常会用到互相关(Cross-Correlation)函数,它是对两个信号的相似性进行度量。这在很多应用中非常有用,比如在无线通信中的信号识别,图像处理中的模式匹配,以及地球物理勘探中地震波的分析等。

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

 

 

其中,x和y分别为两个信号,Rxy(t)为在延时 t 时的互相关值。

在离散时间序列中,可以用求和代替积分进行计算。

 

其中,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]:

 

 

 

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

 

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

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

这里忘了说明:周期信号的自相关序列也是一个同周期的序列。也就是如下公式所示的周期为N的序列x(n)自相关[1]:

在这种情况下,我们计算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:]    

# 最小距离设置为一个频率60Hz的周期

peaks, _ = find_peaks(auto_corr, height=auto_corr.max()/12, distance=fs/60)

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

 

 

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

 

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

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

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

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

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

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

 

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


 

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

要开启对超声流量计工作原理的讨论,关键在于理解超声波在流体中传播的特性以及两者之间如何互动。

超声流量计采用了所谓的“TOF-时间飞逝”方法进行测量。超声收发的配置会存在差异。假设在这种设备中,有两对超声换能器A和B,按照上图所示被置于管道的两侧,都是向下发射,下面的接收。当没有流体流过的时候,从一个传感器发出的超声波到达另一个传感器所需的时间应该是恒定的。然后,当流体开始流过时,这个时间将会发生变化。

超声波流量计的构造有很多种类,简单以上面的图-3所示。具体来说,当流体如图示的方向流动时,从A发出的超声波会被流体带着一起移动,所以它到达接收端的时间t2会少于没有流体流动的情况。反之,从B发出的超声波在到达接收端的过程中需要逆流而上,所以耗费的时间t1会更多。

在流量计内部,这两个时间被用来计算出一种称为“时间差”的值delay,这就是流体流速的直接度量参数。根据这个delay所对应的时间来计算流速的公式见3.2段。

然后,通过对管道的直径和流速的测量,便可以计算出流量。有关超声波在流体中的传播和接收时间差的形成的推导部分,请参考我们之前我们的博文:何消除超声波在流量测量及液位测量中温度的影,其中对超声检测流量稍微有一些说明,不过是基于单纯TOF时差的方式,在实际应用中,超声信号可能会受到各种类型噪声的干扰。如果信号受到过多的干扰,将无法正确测定时差。为了获取准确的流速读数,我们需要尽量消除这些噪声带来的影响。

既然我们看到了相关性对于噪声影响的抵消能力,我们就此引出利用信号的相关性进行流速测量的思路方法。本文不是重点于如何设计,而是提供一种解决问题的思路。

 

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


 

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

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

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

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

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

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

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

 

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

 

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


 

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

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

 

 

 

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

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

 

 

(1)无噪声情况下的模拟
 

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

  • 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     # 采样间隔

 

图-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倍了。

 

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

 

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

  • Estimated velocity:  3.9314356314212877(m/s)

 

(2)有噪声情况下的模拟

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

 

图-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时的输出。

 

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

 

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

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

 

在这种情况下,有无其他的方式提高最后输出结果的精度?答案是肯定的,那就是插值——我们已经设定这个波形是近正余弦的,在python中,我们看到软件包scipy有3阶样条插值的实现方式函数:scipy.interpolate.interp1d。以下的仿真结果就是基于该插值方式实现的。

插值的过程,就是在已有的时间序列中,每个间隔之间均匀地插入设定的时间点数,然后通过插值函数,在已采集的信号(这里是模拟的采集信号)中,对应插入的时间点上,使用3阶样条插值,添加额外的插值。

 

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

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

Estimated velocity:  3.959970232994945m/s——插值后

 

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

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

 

图-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. 小结


 

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

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

  • 非接触测量:通过在管道外壁上安装超声探头,可以避免对流体产生任何影响,适合处理易激发、高温或腐蚀性的流体。
  • 较高精度:相位差法可以实现较高的测量精度,因为它直接测量的是流体的流动速度,而非其他的,可能受到流体性质变化影响的参数。

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

 

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

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

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

  • 管道和流体的不同:如果流体的性质(如粘度、密度)或者管道的材料和状况发生变化,可能需要重新校准设备。
  • 流体中的颗粒或气泡:这些可能会吸收、散射或者反射超声波,从而影响信号质量。
  • 以上并未考虑由于流速引起的多普勒频移影响。
 

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

 

6. 安费诺传感器时间


 

在超声换能器领域,安费诺传感器(Amphenol Sensors)有Piezo Technologies和Airmar两个自有知名品牌。需要温度和压力补偿时,我们当然也是品牌产品多有备选。

Piezo

AIMAR

 

An assortment of ultrasonic transducers

 

Amphenol的Piezo和Airmar品牌的超声传感器以其优越的性能和广泛的应用领域,赢得了行业内的高度认可。

Piezo品牌的超声传感器以其高灵敏度,稳定性和耐用性突出,适用于广泛的密度、粘度和颜色的液压和液体应用等。特别适合需要实现精确控制和测量的场合,例如在医疗、工业自动化和汽车等领域的流量控制、液位测量和距离测量等。

Airmar品牌的超声传感器同样拥有强大的性能,主要用于航海、船舶、海洋科学研究和渔业等领域。它们以其卓越的防水、防腐蚀特性以及在苛刻环境中的可靠性备受推崇。其超声传感器常用于下述场合:深海探测、鱼群定位、水深和水温测量,以及其它海洋环境参数的监测。

无论是需求突出的Piezo,还是适用于海洋环境的Airmar,Amphenol Sensors都能提供一流的解决方案,满足各种行业的需求。

 

 

 


[1] 《数字信号处理—原理、算法与应用》,第四版,普罗克斯著;方艳梅等译, 电子工业出版社,2014.8

 

[本公众号演示代码版权所有 (c) [2024] Amphenol Sensors]


特此免费授予任何获得此软件及相关文档文件(“软件”)副本的人无限制处理软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向其提供软件的人员行使这些权利,但需满足以下条件:

上述版权声明和此权限声明应包含在所有副本或实质部分的软件中。

本软件按“原样”提供,无任何形式的明示或暗示保证,包括但不限于适销性、特定目的适用性和非侵权性的保证。在任何情况下,作者或版权所有者均不承担任何索赔、损害或其他责任,无论是在合同行为、侵权行为或其他行为中,还是与软件或软件的使用或其他交易有关。

 

2024年4月28日 20:31