关于希尔伯特变换的 c语言实现

合集下载

emd 希尔伯特黄变换程序

emd 希尔伯特黄变换程序

(一)简单的EMD程序function imf = emd(x)% Empiricial Mode Decomposition (Hilbert-Huang Transform)% imf = emd(x)% Func : findpeaksx = transpose(x(:));%转置imf = [];while ~ismonotonic(x) %当x不是单调函数,分解终止条件x1 = x;sd = Inf;%均值%直到x1满足IMF条件,得c1while (sd > 0.1) | ~isimf(x1) %当标准偏差系数sd大于0.1或x1不是固有模态函数时,分量终止条件s1 = getspline(x1);%上包络线s2 = -getspline(-x1);%下包络线x2 = x1-(s1+s2)/2;%此处的x2为文章中的hsd = sum((x1-x2).^2)/sum(x1.^2);x1 = x2;endimf{end+1} = x1;x = x-x1;endimf{end+1} = x;% FUNCTIONSfunction u = ismonotonic(x)%u=0表示x不是单调函数,u=1表示x为单调的u1 = length(findpeaks(x))*length(findpeaks(-x));if u1 > 0, u = 0;else, u = 1; endfunction u = isimf(x)%u=0表示x不是固有模式函数,u=1表示x是固有模式函数N = length(x);u1 = sum(x(1:N-1).*x(2:N) < 0);u2 = length(findpeaks(x))+length(findpeaks(-x));if abs(u1-u2) > 1, u = 0;else, u = 1; endfunction s = getspline(x)%三次样条函数拟合成元数据包络线N = length(x);p = findpeaks(x);s = spline([0 p N+1],[0 x(p) 0],1:N);-------------------------------------------------------------------------------- function n = findpeaks(x)% Find peaks.找到极值% n = findpeaks(x)n = find(diff(diff(x) > 0) < 0);u = find(x(n+1) > x(n));n(u) = n(u)+1;------------------------------------------------------------------------------------------ ---------------------------------------------------------------------------------------- function plot_hht00(x,Ts)% 双边带调幅信号的EMD分解% Plot the HHT.% plot_hht(x,Ts)%% :: Syntax% The array x is the input signal and Ts is the sampling period.% Example on use: [x,Fs] = wavread('Hum.wav');% plot_hht(x(1:6000),1/Fs);% Func : emd% Get HHT.clear all;close all;Ts=0.0005;t=0:Ts:1; % 采样率2000HZ% 调幅信号x=sin(2*pi*t).*sin(40*pi*t);s1 = getspline(x);%上包络线s2 = -getspline(-x);%上包络线x1 = (s1+s2)/2;%此处的x2为文章中的hfigure;plot(t,x);xlabel('Time'), ylabel('Amplitude');title('双边带调幅信号');hold on;plot(t,s1,'-r');plot(t,s2,'-r');plot(t,x1,'g');imf = emd(x);for k = 1:length(imf)b(k) = sum(imf{k}.*imf{k});th = angle(hilbert(imf{k}));d{k} = diff(th)/Ts/(2*pi);end[u,v] = sort(-b);b = 1-b/max(b);% Set time-frequency plots.N = length(x);c = linspace(0,(N-2)*Ts,N-1);%figure;for k = v(1:2)plot(c,d{k},'k.','Color',b([k k k]),'MarkerSize',3); hold on;set(gca,'FontSize',8,'XLim',[0 c(end)],'YLim',[0 50]);%设置x、y轴句柄xlabel('Time'), ylabel('Frequency');title('原信号时频图');end% Set IMF plots.M = length(imf);N = length(x);c = linspace(0,(N-1)*Ts,N);for k1 = 0:4:M-1figurefor k2 = 1:min(4,M-k1), subplot(4,1,k2), plot(c,imf{k1+k2});set(gca,'FontSize',8,'XLim',[0 c(end)]);title('EMD分解结果');endxlabel('Time');end(二)function imf = emd(x)% Empiricial Mode Decomposition (Hilbert-Huang Transform)% imf = emd(x)% Func : findpeaksx = transpose(x(:));%转置imf = [];while ~ismonotonic(x) %当x不是单调函数,分解终止条件x1 = x;sd = Inf;%均值%直到x1满足IMF条件,得c1while (sd > 0.1) | ~isimf(x1) %当标准偏差系数sd大于0.1或x1不是固有模态函数时,分量终止条件s1 = getspline(x1);%上包络线s2 = -getspline(-x1);%下包络线x2 = x1-(s1+s2)/2;%此处的x2为文章中的hsd = sum((x1-x2).^2)/sum(x1.^2);x1 = x2;endimf{end+1} = x1;x = x-x1;endimf{end+1} = x;% FUNCTIONSfunction u = ismonotonic(x)%u=0表示x不是单调函数,u=1表示x为单调的u1 = length(findpeaks(x))*length(findpeaks(-x));if u1 > 0, u = 0;else, u = 1; endfunction u = isimf(x)%u=0表示x不是固有模式函数,u=1表示x是固有模式函数N = length(x);u1 = sum(x(1:N-1).*x(2:N) < 0);u2 = length(findpeaks(x))+length(findpeaks(-x));if abs(u1-u2) > 1, u = 0;else, u = 1; endfunction s = getspline(x)%三次样条函数拟合成元数据包络线N = length(x);p = findpeaks(x);s = spline([0 p N+1],[0 x(p) 0],1:N);--------------------------------------------------------------------------------------------------------------------------------------------------------------- function n = findpeaks(x)% Find peaks.找到极值% n = findpeaks(x)n = find(diff(diff(x) > 0) < 0);u = find(x(n+1) > x(n));n(u) = n(u)+1;------------------------------------------------------------------------------------------ ---------------------------------------------------------------------------------------- function plot_hht00(x,Ts)% 双边带调幅信号的EMD分解% Plot the HHT.% plot_hht(x,Ts)%% :: Syntax% The array x is the input signal and Ts is the sampling period.% Example on use: [x,Fs] = wavread('Hum.wav');% plot_hht(x(1:6000),1/Fs);% Func : emd% Get HHT.clear all;close all;Ts=0.0005;t=0:Ts:1; % 采样率2000HZ% 调幅信号x=sin(2*pi*t).*sin(40*pi*t);s1 = getspline(x);%上包络线s2 = -getspline(-x);%上包络线x1 = (s1+s2)/2;%此处的x2为文章中的hfigure;plot(t,x);xlabel('Time'), ylabel('Amplitude');title('双边带调幅信号');hold on;plot(t,s1,'-r');plot(t,s2,'-r');plot(t,x1,'g');imf = emd(x);for k = 1:length(imf)b(k) = sum(imf{k}.*imf{k});th = angle(hilbert(imf{k}));d{k} = diff(th)/Ts/(2*pi);end[u,v] = sort(-b);b = 1-b/max(b);% Set time-frequency plots.N = length(x);c = linspace(0,(N-2)*Ts,N-1);%figure;for k = v(1:2)plot(c,d{k},'k.','Color',b([k k k]),'MarkerSize',3); hold on;set(gca,'FontSize',8,'XLim',[0 c(end)],'YLim',[0 50]);%设置x、y轴句柄xlabel('Time'), ylabel('Frequency');title('原信号时频图');end% Set IMF plots.M = length(imf);N = length(x);c = linspace(0,(N-1)*Ts,N);for k1 = 0:4:M-1figurefor k2 = 1:min(4,M-k1), subplot(4,1,k2), plot(c,imf{k1+k2}); set(gca,'FontSize',8,'XLim',[0 c(end)]);title('EMD分解结果');endxlabel('Time');endplot_hht00(x,Ts)只画出了时频图,没有三维图。

希尔伯特(Hilbert)变换

希尔伯特(Hilbert)变换

希尔伯特(Hilbert)变换希尔伯特(Hilbert)变换是一种信号处理中常用的数学工具之一,主要用于将实数信号转化为复数信号,并提取出复信号的包络和瞬时相位等信息。

本文将对希尔伯特变换的基本概念、性质以及在信号处理中的应用进行介绍。

一、基本概念1. 复信号的生成在信号处理中,我们往往需要将一个实数信号变为一个复数信号,这可以通过对信号进行“解析”的方式来实现。

具体地,我们将实数信号x(t)通过一个信号处理器H(t)(即称为系统传递函数)得到一个复数信号X(t),即:X(t) = H(t) * x(t)其中,符号“*”表示对那些对应时间点处的信号进行点乘,即乘上相应的复数模长e^(jw),其中w为角频率,j为单位复数。

2. 复信号的包络和瞬时相位由于复数信号包含实部和虚部两个分量,其中实部和虚部分别表示原信号的信号值和90度相位移的信息。

因此,我们可以通过分别从复数信号中提取出它的实部和虚部,来获得原始信号的包络和瞬时相位两个信息。

具体的,假设我们有一个复数信号X(t) = x(t) + j*y(t),其中x(t)为实部,y(t)为虚部,则:信号的包络:A(t) = sqrt(x^2(t) + y^2(t))其中,atan2(y(t), x(t))表示y(t)/x(t)的反正切,但与通常的反正切最大的区别在于,它不仅考虑了y(t)/x(t)的值,而且也考虑了x(t)的符号,从而在所有象限范围内都具有唯一性。

3. 希尔伯特变换希尔伯特变换是一种用于从实数信号中构造复数信号的技术。

具体地,假设我们有一个实数信号x(t),那么它的希尔伯特变换y(t)定义如下:y(t) = H[x(t)] = P.\ I.C.\ \lim_{\varepsilon \to 0} \frac{1}{\pi}\int_{-\infty}^\infty \frac{x(t')}{t-t'-j\varepsilon} dt'其中,P和I.C.分别表示柯西主值和积分常数项。

Hilbert变换C源码

Hilbert变换C源码

Hilbert变换C源码/******************************************/ /* main.c/******************************************/#include <stdio.h>#include <math.h>#define N 500#define sq(X) ((X)*(X))int main(){int i;double x;double delta[N];double kappa[N];double y;double xmin = -10.;double xmax = 10.;double cd = -1.;double w = 2.;double h = (xmax - xmin) / N;for (i = 0; i < N; i++){x = 2. * (xmin + i * h - cd) / w;if (x < -1.)delta[i1] = 0.;else if (x < 1.)delta[i1] = sqrt(1. - sq(x));elsedelta[i1] = 0.;}hilbert(n, delta, kappa);for (i = 0; i < N; i++){x = 2. * (xmin + i * h - cd) / w;if (x < -1.)y = x + sqrt(sq(x) - 1.);else if (x < 1.)y = x;elsey = x - sqrt(sq(x) - 1.);(void) printf("%.3f %.3f %.3f %.3f\n", xmin + i * h, delta[i], k ppa[i], y);}return 0;}/******************************************//* hilbert.c/******************************************/void hilbert(int, double[], double[]);/******************************************//* hilbert.c/******************************************/#include <stdio.h>#include "hilbert.h"#define PI 3.14159265void hilbert(int n, double delta[], double kappa[]) {double d1, d2, d3, d4;int i1, i2;for (i1 = 0; i1 < n; i1++){kappa[i1] = 0.;for (i2 = 1; i2 < n; i2++){d1 = (i1+i2<N)? delta[i1+i2]: 0.;d2 = (i1-i2>=0)? delta[i1-i2]: 0.;d3 = (i1+i2+1<N)? delta[i1+i2+1]: 0.;d4 = (i1-i2-1>=0)? delta[i1-i2-1]: 0.;kappa[i1] -= 0.5 * (d1-d2) / i2 + 0.5 * (d3 - d4) / (i2 1);}kappa[i1] /= PI;}/***********************************************/* 说明/***********************************************The Hilbert transformThis package performs a numerical Hilbert transform. Download Compressed tar-fileorhilbert.c and hilbert.hHeader fileThe program must include the header file#include "hilbert.h"/***********************************************/* 说明kappa[i1] -= 0.5 * (d1-d2) / i2 + 0.5 * (d3 - d4) / (i2 1);}kappa[i1] /= PI;}}/***********************************************/* 说明/***********************************************The Hilbert transformThis package performs a numerical Hilbert transform. Download Compressed tar-filehilbert.c and hilbert.hHeader fileThe program must include the header file#include "hilbert.h"and then call hilbert() to perform the transform.UsageIf delta and kappa are arrays of n doubles, both arrays are al located by the maiprogram.The input data are in delta and the call hilbert(n, delta, kapp a) will return thHilbert transform of delta in kappa.n and delta are not modified.CompilationCompile the package using a C-compiler.If you use a makefile and this makefile looks like thisa.out: a.ob.oc.occ a.o b.o c.o...a.o: a.c d.hcc -c a.c...and you use the package in a.c, change the makefile to look like thisa.out: a.ob.oc.o hilbert.occ a.o b.o c.o hilbert.o...a.o: a.c d.h hilbert.hcc -c a.c...hilbert.o: hilbert.c hilbert.hcc -c hilbert.cDemomain.c uses the package to perform a Hilbert transform of a semi-ellipsis.Output from the program is a table.First column: xSecond column: The semi-ellipsisThird column: The Hilbert transform calculated by hilbert().Fourth column: The analytical Hilbert transform of the semi -ellipsis.。

希尔伯特黄变换获取时频谱, python

希尔伯特黄变换获取时频谱, python

希尔伯特黄变换(Hilbert-Huang Transform, HHT)是一种非线性、非平稳信号分析方法,能够有效地获取信号的时频谱信息。

在信号处理和振动分析领域,HHT被广泛应用于信号的时间-频率特征提取、故障诊断、模式识别等方面。

而Python作为一种功能强大的编程语言,为HHT的实现提供了便利条件。

下面将介绍希尔伯特黄变换的基本原理及其在Python中的实现。

1. 希尔伯特变换希尔伯特变换是对信号进行解析的一种数学方法,其核心是通过与原始信号相关的虚部信号来构建解析信号。

希尔伯特变换可以将实部信号与虚部信号相互转换,从而实现对信号的时域和频域分析。

希尔伯特变换的数学表示如下:\[H(x(t)) = P \left( \frac{1}{\pi t} \right) \ V \int_{-\infty}^{\infty} \frac{x(\tau)}{t-\tau} d\tau \]其中,\(x(t)\)为原始信号,\[H(x(t))\]为对应的希尔伯特变换,\(P\)表示柯西主值,\(V\)表示广义积分。

在时频分析中,希尔伯特变换可以用于提取信号的振幅和相位信息,从而实现时域和频域特征的全面分析。

2. 黄变换黄变换是由我国科学家黄次寅于1998年提出的一种基于希尔伯特变换的信号分析方法。

与传统的傅立叶变换和小波变换相比,黄变换更适用于非线性和非平稳信号的分析。

黄变换包括两个核心步骤:经验模态分解(EMD)和希尔伯特谱分析。

EMD是将复杂信号分解成若干个本征模态函数(EMD),而希尔伯特谱分析是在每个本征模态函数上进行希尔伯特变换,从而获取每个本征模态函数的时频特征。

3. 希尔伯特黄变换希尔伯特黄变换是将希尔伯特变换与黄变换相结合的一种信号分析方法。

希尔伯特黄变换主要包括以下步骤:1) 对原始信号进行EMD分解,得到若干个本征模态函数;2) 对每个本征模态函数进行希尔伯特变换,得到每个本征模态函数的时频谱信息;3) 将每个本征模态函数的时频谱信息相加,得到原始信号的时频谱分布。

c语言 希尔伯特曲线

c语言 希尔伯特曲线

c语言希尔伯特曲线
希尔伯特曲线是一种由德国数学家大卫·希尔伯特在1891年定
义的分形曲线,也被称为希尔伯特空间填充曲线。

它具有许多有趣的性质和应用,包括在图像压缩、信号处理和计算机图形学中的应用。

在C语言中,我们可以通过递归算法来实现希尔伯特曲线的绘制。

具体的实现过程如下:
1. 定义一个绘制函数,该函数接受四个参数:起始点的坐标、
线段的长度、绘制方向和递归的深度。

2. 在绘制函数中,首先根据当前的方向和线段长度计算出终止
点的坐标。

3. 如果递归深度为0,表示已经到达最底层,直接绘制一条线
段连接起始点和终止点。

4. 如果递归深度不为0,那么需要先递归绘制下一层的曲线。

具体的方法是将线段长度除以2,然后将当前方向逆时针旋转90度
分别得到三个新的方向,接着分别以起始点和终止点为起点,递归调用绘制函数。

5. 最后,在所有递归调用完成后,再绘制一条线段连接起始点
和终止点。

通过以上的实现方法,我们就可以在C语言中实现希尔伯特曲线的绘制了。

这不仅可以帮助我们深入理解分形图形的生成原理,还可以展示C语言的递归和图形绘制能力。

- 1 -。

证明希尔伯特变换是正交的

证明希尔伯特变换是正交的

证明希尔伯特变换是正交的希尔伯特变换的正交性在信号处理中有着非常重要的应用。

通过对其进行研究和证明,我们可以更好地了解希尔伯特变换的性质以及在信号处理中的实际应用。

下面,我们将为大家介绍证明希尔伯特变换是正交的详细过程。

首先,我们需要明确什么是希尔伯特变换。

希尔伯特变换是一种线性运算,用于将一个信号转换为其复解析信号,即在傅里叶变换的基础上,将实部和虚部的信号分别反转并取相反数,用于分析信号在时域和频域中的行为。

那么,如何证明希尔伯特变换是正交的呢?步骤一:定义内积首先,我们需要定义内积。

内积是在函数空间中定义的一种运算,用于度量两个函数相似程度的大小。

对于两个实函数f(x)和g(x),其内积定义如下:( f , g )= ∫f(x)g(x)dx对于两个复函数,其内积定义如下:(f , g)= ∫f*(x)g(x)dx其中,f*(x)是f(x)的共轭复数。

步骤二:证明正交性根据内积的定义,我们可以证明希尔伯特变换是正交的。

首先,我们需要证明希尔伯特变换是有限范围内的,即其信号在无穷远处趋于0。

根据奇偶性,我们可以证明实部和虚部对应的傅里叶变换值分别关于频率轴对称,因此,它们的线性组合即希尔伯特变换的傅里叶变换值也是关于频率轴对称的,这就保证了其在无穷远处趋于0。

接下来,我们需要证明希尔伯特变换的内积等于零。

我们可以将希尔伯特变换的实部和虚部表示为:h(x)=f(x)cos(wx)-g(x)sin(wx)h*(x)=f(x)cos(wx)+g(x)sin(wx)其中,f(x)和g(x)是两个实函数,w是一个常数。

我们可以将希尔伯特变换的内积表示为:(h , h*)= ∫[f(x)cos(wx)-g(x)sin(wx)][f(x)cos(wx)+g(x)sin(wx)]dx将其展开,得到:(h , h*)= ∫[f(x)^2+g(x)^2]cos^2(wx)dx +∫[f(x)^2+g(x)^2]sin^2(wx)dx根据三角函数的性质,cos^2(wx)+sin^2(wx)=1,因此,上式可以简化为:(h , h*)= ∫[f(x)^2+g(x)^2]dx由于f(x)和g(x)都是实函数,因此其和的平方和是非负的,即(h , h*)≥ 0。

1希尔伯特变换的基本原理

1希尔伯特变换的基本原理

1希尔伯特变换的基本原理希尔伯特变换(Hilbert transform)是一种非常重要的信号处理技术,它在时间域和频率域之间建立了一种特殊的变换关系,可以通过提取信号的相位信息来分析信号的时频特性。

本文将详细介绍希尔伯特变换的基本原理。

一、定义与表达式希尔伯特变换首先由德国数学家大卫·希尔伯特(David Hilbert)提出,他建立了一个衍生(Analytic)函数的概念。

对于一个实值信号函数x(t),它的希尔伯特变换H{x(t)}可以表示为:H{x(t)} = \frac{1}{\pi} \int_{-\infty}^{\infty}\frac{x(\tau)}{t-\tau} d\tau其中,H{x(t)}是实值信号的希尔伯特变换,x(t)是原始信号,t是时间变量。

希尔伯特变换可以通过对信号的频谱进行处理实现,首先对原始信号进行傅里叶变换得到频谱X(f),然后将频谱进行处理后再进行逆傅里叶变换得到希尔伯特变换。

具体来说,对于一个实值信号x(t),它的傅里叶变换为X(f),那么它的希尔伯特变换H{x(t)}可以表示为:H{x(t)} = IFT \{ -j \cdot sign(f) \cdot X(f) \}其中,IFT 表示逆傅里叶变换,sign(f)是频率变量的符号函数。

二、频谱分析希尔伯特变换的一个重要应用是信号的频谱分析,通过分析信号的相位信息来了解信号的时频特性。

希尔伯特变换可以提取信号的边带频率信息,从而反映信号的局部属性。

对于一个实值信号x(t),它的频谱X(f)可以分解为实部和虚部:X(f) = X_r(f) + j \cdot X_i(f)其中,X_r(f)和X_i(f)分别是实部和虚部的频谱函数。

希尔伯特变换可以通过将频谱的虚部部分置零来获得信号的解析信号。

解析信号是一种由实信号和其希尔伯特变换构成的复信号表示,它具有可分辨信号的相位信息的特点。

三、希尔伯特变换的性质希尔伯特变换具有许多重要的性质,其中最重要的性质是希尔伯特变换的平移性质和相位信息的提取。

希尔伯特变换 时域做法

希尔伯特变换 时域做法

希尔伯特变换在时域的实现方法可以通过以下步骤进行:
1. 确定输入信号f(t)。

2. 构造一个冲击响应为1/πt的单位冲激响应函数g(t)。

3. 将输入信号f(t)与单位冲激响应函数g(t)进行卷积运算,得到输出信号h(t)。

这个过程在时域中相当于将输
入信号通过一个滤波器,该滤波器的冲击响应为g(t)。

4. 输出信号h(t)即为输入信号f(t)的希尔伯特变换结果。

需要注意的是,上述方法中的单位冲激响应函数g(t)是连续时间希尔伯特变换的情况。

对于离散时间希尔伯特变换,单位冲激响应函数会有所不同,但基本的实现思路是相似的。

另外,在实际应用中,由于计算机只能处理离散信号,因此需要对连续信号进行采样和离散化处理。

在离散化后,可以利用离散时间傅里叶变换(DTFT)或离散余弦变换(DCT)等方法来计算希尔伯特变换。

总之,希尔伯特变换在时域的实现方法主要是通过卷积运算将输入信号与一个特定的单位冲激响应函数进行滤波处理,从而得到输出信号。

这个过程可以看作是输入信号通过一个特定的滤波器或系统。

希尔伯特变换c语言实现

希尔伯特变换c语言实现

希尔伯特变换c语言实现希尔伯特变换(Hilbert Transform)是一种信号处理中常用的变换,用于将实部信号转换为虚部信号(或者将虚部信号转换为实部信号),常用于频率分析、信号解调和相位估计等领域。

以下是一个简单的C 语言实现示例:```c#include <stdio.h>#include <math.h>void hilbertTransform(float* input, float* output, int length) { int n, k;float temp;for (n = 0; n < length; n++) {output[n] = 0;for (k = 0; k < length; k++) {temp = (n - k) >= 0 ? (n - k) : (n - k + length);output[n] += input[k] * ((temp & 1) ? -1.0 / temp : 1.0 /temp);}}}int main() {float input[] = {1.0, 2.0, 3.0, 4.0, 5.0};int length = sizeof(input) / sizeof(float);float output[length];hilbertTransform(input, output, length);printf("Hilbert Transform result:\n");for (int i = 0; i < length; i++) {printf("%.4f ", output[i]);}printf("\n");return 0;}```在上述示例代码中,`hilbertTransform`函数接受一个实部信号`input`和一个用于存储虚部信号的数组`output`,以及信号长度`length`作为参数。

希尔伯特变换的实现方法

希尔伯特变换的实现方法

希尔伯特变换的实现方法《说说希尔伯特变换的实现方法那些事儿》嘿,大家好呀!今天咱来聊聊希尔伯特变换的实现方法。

这玩意儿,可不简单呐,但咱别怕,慢慢唠。

你说希尔伯特变换,听着就感觉挺高深莫测的吧?其实啊,简单来说,它就是个能把一个信号变来变去的厉害家伙。

就像魔术师一样,能让信号在它手里变出各种花样。

要实现希尔伯特变换,咱得有点法宝。

就好像孙悟空没了金箍棒,那也厉害不起来呀!首先得明白那些数学公式,别一看到就头疼,不就是几个符号嘛,咱跟它较较劲。

比如说,离散的希尔伯特变换实现方法,就像是搭积木一样,一块一块拼起来。

每一步都得稳稳当当的,不能马虎。

不然最后拼出来的说不定是个歪七扭八的东西,那就不好玩啦。

然后呢,还有各种算法,有的复杂得让你感觉像在走迷宫,绕来绕去的。

但别怕,咱就把它当成一个超级大迷宫来探险,一边走一边找线索,总能找到出口的!有时候啊,我就在想,这希尔伯特变换就像是个调皮的小精灵,你得好好哄着它,它才会乖乖听话,给你变出想要的结果。

实现希尔伯特变换的过程中,也会遇到一些困难。

就像路上的小石子,会绊你一下。

比如说突然出现的计算错误啦,或者是理解上的迷茫啦。

但咱不能被这些小问题打倒,拍拍屁股继续前进。

而且啊,和小伙伴们一起讨论也是很重要的哦!大家一起头脑风暴,说不定谁就想出了一个奇妙的点子,一下子就把难题给解决了呢。

就像一群小伙伴一起打游戏,互相帮助,过关斩将。

总之呢,希尔伯特变换的实现方法虽然有点难,但也很有趣呀!就像攀登一座高峰,虽然过程有点累,但当你爬到山顶,看到那美丽的风景时,一切付出都值了。

所以,让我们一起勇攀这座“希尔伯特变换”的高峰吧,说不定还能发现一些别人没发现的美景呢!哈哈!加油哦!。

加窗希尔伯特(hilbert)变换

加窗希尔伯特(hilbert)变换

加窗希尔伯特(hilbert)变换窗口化希尔伯特(Hilbert)变换是在时间序列数据中提取幅度和相位特征的一种有效方法。

该方法将希尔伯特变换应用于一个带有窗函数的时间序列,可以使其具有高分辨率和可靠性,而且能够广泛应用于信号处理、图像处理、控制理论、模式识别等领域。

希尔伯特变换是一种常用于信号处理和通信系统的数学工具。

经常出现在音频、图像和视频信号处理等领域。

希尔伯特变换将一个信号分解成两个部分,一个是原始信号,另一个是原始信号的希尔伯特变换。

希尔伯特变换对于信号的幅度和相位特征进行分离并对它们进行量化,同时在信号处理中还可用于边缘检测、波形变形和调制识别等任务。

希尔伯特变换可以表示为一个固定的线性变换,其傅里叶变换是复共轭对称的。

给定一个信号f(t),希尔伯特变换产生一个新信号h(t),使得h(t)与f(t)的傅里叶变换有以下关系:H(f) = \begin{cases} i\cdot F(f),& f>0 \\ 0, & f=0 \\ -i\cdot F(f), & f<0 \end{cases}在窗口化希尔伯特变换中,我们将信号f(t)与一个窗函数w(t)进行卷积,产生新信号g(t):g(t) = f(t) * w(t)然后对于信号g(t)进行希尔伯特变换得到h(t):h(t) = \mathcal{H}\{g(t)\}h(t)包含了f(t)的幅度和相位信息。

通常幅度用于表示信号的能量或大小,而相位用于表示信号随时间的变化。

希尔伯特变换可以实现幅度谱和相位谱的分离,因此可以用于各种情况下的信号处理任务。

窗口化希尔伯特变换在信号处理中应用广泛。

例如,用于检测和分类呼吸和睡眠状态,以及研究心脏疾病和脑电信号。

它还可以用于分析和模拟语音和音乐信号,进行图像处理和分割以及模式识别和机器学习等任务。

总之,窗口化希尔伯特变换是一种强大而灵活的信号处理技术,它可以从时域和频域两方面提供相当优异的表现。

希尔伯特变换程序

希尔伯特变换程序
axis tight;
subplot(3,2,5),plot(tt,d1);
ylabel('d1');
axis tight;
fx=abs(fft(A(1:2048)));
fx=fx.*fx;
nie1=(fx(159)+fx(160)+fx(161))/3;
nie2=(fx(319)+fx(320)+fx(321))/3;
axis tight;
subplot(3,2,2),plot(tt,d4);
ylabel('d4');
axis tight;
subplot(3,2,3),plot(tt,d3);
ylabel('d3');
axis tight;
subplot(3,2,4),plot(tt,d2);
ylabel('d2');
A=B(n*1024+1:(n+8)*1024);
A=A/(2^30);
A=A-mean(A);
fs=2000;
fa=fs/2;
t=0:8191;
tt=1/2000*t;
ti=fs/8196*t;
[c,l]=wavedec(A,4,'db8');
a4=wrcoef('a',c,l,'db8',4);
d4=wrcoef('d',c,l,'db8',4);
d3=wrcoef('d',c,l,'db8',3);
d2=wrcoef('d',c,l,'db8',2);

兰州商学院毕业设计-希尔伯特变换的分析与应用-毕业论文

兰州商学院毕业设计-希尔伯特变换的分析与应用-毕业论文

兰州商学院本科生毕业论文(设计)论文(设计)题目:希尔伯特变换的分析与应用学院、系:信息工程学院计算机科学与技术系专业 (方向):电子信息工程年级、班:2007级电子信息工程学生姓名:贾金花指导教师:路永华_2011年5 月28 日声明本人郑重声明:所呈交的毕业论文(设计)是本人在导师的指导下取得的成果。

对本论文(设计)的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。

因本毕业论文(设计)引起的法律结果完全由本人承担。

本毕业论文(设计)成果归兰州商学院所有。

特此声明毕业论文(设计)作者签名:年月日希尔伯特变换的分析与应用摘要希尔伯特(Hilbert)变换是信号分析处理技术中的一种重要方法,它可以将信号进行90度相移,并能有效地提取复杂信号的瞬时参数——瞬时振幅、瞬时相位和瞬时频率。

文中详细讨论了希尔伯特的特点及算法,并介绍希尔伯特变换在探地雷达数据处理、数字I-Q下变频器及通信解调中的应用。

[关键词] Hilbert变换,探地雷达,信号处理,瞬时参数ABSTRACTHilbert transform is signal (the analysis technology is a kind of important method, it can deliver signals to 90 degrees phase shift, and can effectively extract complex signal instantaneous parameter, the instantaneous amplitude, instantaneous phase and instantaneous frequency. This paper discusses in detail the characteristics and Hilbert, and introduce the Hilbert transformation algorithm in GPR data processing, digital I - Q under the application of inverter and communication demodulation.[Key words] Hilbert Transform, ground penetrating radar, signal processing, instantaneous parameters目录一、引言 (1)(一)背景及意义 (1)(二)希尔伯特变换的发展现状 (2)二、希尔伯特变换的分析 (3)(一)希尔伯特变换的定义 (3)1、卷积积分 (3)相位 (3)2、23、解析信号的虚部 (4)(二)希尔伯特变换的性质 (5)三、希尔伯特变换的应用 (7)( 一)希尔伯特变换在探地雷达数据处理中的应用 (7)1、在探地雷达中的应用 (7)2、公式 (8)3、算法 (9)4、希尔伯特变换C程序 (10)5、在探地雷达中的应用效果 (14)(二)数字I-Q下变频器 (15)1、希尔伯特变换 (15)2、基于希尔伯特变换的数字I-Q下变频器 (16)(三)希尔伯特变换在解调中的应用 (17)1、希尔伯特变换 (17)2、在解调中的应用 (18)3、解调性能分析 (19)四、结论与前景展望 (20)(一)结论 (20)(二)前景展望 (21)参考文献 (22)致谢 (23)希尔伯特变换的分析与应用一、引言(一)背景及意义在通信系统中,经常需要对一个信号进行正交分解,即分解为同相分量和正交分量。

c++ 希尔伯特变换 简书

c++ 希尔伯特变换 简书

C++ 希尔伯特变换简书希尔伯特变换是一种广泛应用在信号处理领域的数学工具,它将一个实函数转换成一个复函数,其中实部和虚部分别代表基本信号和相位信息。

C++ 是一门高效、跨平台的编程语言,被广泛用于图像处理、音频处理、机器学习等领域。

本文将介绍如何使用C++ 实现希尔伯特变换,并探讨其应用。

一、希尔伯特变换的定义和性质希尔伯特变换可以将一个实函数 f(t) 转换为一个复函数 H(f(t)),其中实部 h(t) 表示原函数 f(t) 最基本的信息,虚部 g(t) 表示原函数 f(t) 的相位信息。

具体定义如下:H(f(t)) = \frac{1}{\pi} \cdot PV \int_{-\infty}^{\infty} \frac{f(\tau)}{t-\tau}d\tau其中PV 表示Cauchy 主值,即对于可能存在奇点的积分,将积分路径绕过奇点,使得积分路径两侧的积分结果相同。

希尔伯特变换的性质包括:1.线性性:H(af(t) + bg(t)) = aH(f(t)) + bH(g(t))2.对称性:g(t) = \frac{1}{\pi} PV \int_{-\infty}^{\infty} \frac{h(\tau)}{t-\tau}d\tau3.平移性:H(f(t-t0)) = e^{-i\omega t0} \cdot H(f(t))4.调制性:H(e^{i\omega0 t}f(t)) = i\cdot sgn(\omega - \omega0) \cdot H(f(t))其中 sgn(x) 表示符号函数,当 x>0 时,sgn(x) = 1;当 x<0 时,sgn(x) = -1。

二、C++ 实现希尔伯特变换实现希尔伯特变换的关键在于计算 Cauchy 主值积分。

在 C++ 中,可以使用辛普森积分、龙贝格积分等数值积分方法来近似计算。

下面是使用龙贝格积分实现希尔伯特变换的代码:#include <iostream>#include <cmath>using namespace std;const double pi = acos(-1.0);double func(double t, double tau){return cos(pi*(t-tau)/2)/(pi*(t-tau));}double calc_h(double t, double arr[], int n, double h){double s = 0.0;for(int j=1; j<=n; j++){double x = t - (j-1)*h;s += arr[j-1] * func(t, x);}return s;}double calc_complex(double t, double arr[], int n, double h) {double s = 0.0;for(int j=1; j<=n; j++){double x = t - (j-1)*h;s += arr[j-1] * func(t, x);}return s - arr[n-1]*func(t, 0) + 2*arr[n-1]*func(t, t-h);}void hilbert(double arr[], int n, double h, double out_arr[]) {for(int i=0; i<n; i++){double t = i*h;if(i==0){out_arr[i] = 0;}else{out_arr[i] = calc_complex(t, arr, n, h) + I*calc_h(t, arr, n, h);}}}int main(){int n = 1000;double h = 0.001;double arr[n];double out_arr[n];for(int i=0; i<n; i++){double t = i*h;arr[i] = sin(2*pi*50*t) + sin(2*pi*120*t);}hilbert(arr, n, h, out_arr);for(int i=0; i<n; i++){cout << out_arr[i] << endl;}return 0;}三、希尔伯特变换的应用希尔伯特变换在信号处理、图像处理、音频处理等领域有着广泛的应用。

离散信号希尔伯特变换

离散信号希尔伯特变换

离散信号希尔伯特变换1. 简介离散信号希尔伯特变换(Discrete Hilbert Transform)是一种对离散信号进行频域分析的方法。

它是对连续信号希尔伯特变换的离散化,通过计算信号的解析信号,可以提取信号的幅度和相位信息,对信号进行分析和处理。

希尔伯特变换是由德国数学家大卫·希尔伯特在19世纪末提出的,最初用于解决振动理论中的问题。

后来,希尔伯特变换被推广到信号处理领域,并且在通信、图像处理、音频处理等应用中得到了广泛应用。

2. 离散信号希尔伯特变换的原理离散信号希尔伯特变换的原理基于连续信号希尔伯特变换的离散化。

连续信号的希尔伯特变换可以表示为:H{x(t)}=1πP∫x(τ)t−τ∞−∞dτ其中,x(t)为连续信号,H{x(t)}表示x(t)的希尔伯特变换,P表示柯西主值。

对于离散信号,我们可以通过采样将其转换为连续信号。

假设离散信号为x[n],采样频率为F s,采样周期为T s=1F s ,则采样后的连续信号为x(t)=∑x∞n=−∞[n]⋅sinc(F s(t−nT s)),其中sinc(x)=sin(πx)πx。

离散信号x[n]的希尔伯特变换可以表示为:H{x[n]}=1πP∫x(τ)n−τ∞−∞dτ将x(t)代入上式,得到:H{x[n]}=1πP∫∑x∞m=−∞[m]⋅sinc(F s(nT s−mT s))n−τ∞−∞dτ化简上式,可以得到离散信号希尔伯特变换的计算公式。

3. 离散信号希尔伯特变换的计算方法离散信号希尔伯特变换的计算方法可以分为时域方法和频域方法。

3.1 时域方法时域方法是通过计算离散信号的卷积来实现离散信号希尔伯特变换。

假设离散信号为x[n],其希尔伯特变换为H{x[n]}。

首先,计算x[n]的逆离散傅里叶变换(IDFT),得到x(t)。

然后,计算x(t)的希尔伯特变换,得到H{x(t)}。

最后,通过采样x(t),得到H{x[n]}。

具体步骤如下:1.对x[n]进行IDFT,得到x(t)。

使用 cuda 进行希尔伯特变换

使用 cuda 进行希尔伯特变换

使用 cuda 进行希尔伯特变换使用CUDA进行希尔伯特变换希尔伯特变换是一种常用的信号处理技术,用于在时域和频域之间进行转换。

CUDA是一种并行计算平台和编程模型,可用于加速计算密集型任务。

将这两者结合起来,可以实现高效的希尔伯特变换。

希尔伯特变换的基本原理是将一个实函数映射为一个复函数,其中复函数的实部是原函数,虚部是原函数的希尔伯特变换。

希尔伯特变换常用于信号处理、通信系统和图像处理等领域。

在传统的计算方式下,希尔伯特变换的计算复杂度较高,特别是当信号长度较长时。

为了提高计算效率,可以利用并行计算的优势,使用CUDA进行希尔伯特变换。

CUDA是由NVIDIA推出的一种并行计算平台和编程模型,它允许开发人员利用GPU的并行计算能力来加速计算密集型任务。

CUDA使用C语言作为编程语言,并提供了一系列的API来控制GPU的操作。

通过使用CUDA,可以将希尔伯特变换的计算任务分割成多个小任务,并在GPU上并行计算这些小任务,从而大大提高计算效率。

使用CUDA进行希尔伯特变换的步骤如下:1. 数据准备:首先需要将要进行希尔伯特变换的数据加载到GPU内存中。

可以使用CUDA提供的内存管理函数来分配和拷贝内存。

2. 并行计算:将数据划分成多个小任务,并将这些小任务分配给不同的GPU线程进行计算。

可以使用CUDA的并行计算模型来管理线程和块的分配。

3. 计算结果合并:将每个线程计算得到的结果合并起来,得到最终的希尔伯特变换结果。

4. 结果输出:将计算得到的希尔伯特变换结果保存到内存中,或者输出到文件中供后续处理使用。

通过使用CUDA进行希尔伯特变换,可以充分利用GPU的并行计算能力,加速计算过程。

相比传统的计算方式,使用CUDA进行希尔伯特变换可以显著提高计算速度,尤其是在处理大规模信号数据时。

除了希尔伯特变换,CUDA还可以用于加速其他信号处理算法,如快速傅里叶变换、卷积运算等。

在实际应用中,使用CUDA进行信号处理可以大大提高算法的效率,从而实现更快速、更精确的信号处理。

关于希尔伯特变换的c语言实现

关于希尔伯特变换的c语言实现

关于希尔伯特变换的c语言实现最近毕设需要用到希尔伯特变换的知识,今天做完之后决定还是记录下思路。

当然是数字信号的希尔伯特变换上面是连续信号的希尔伯特变换,离散的应该也能根据上面写(没现成的图片,懒得编辑公式了)。

这里打算采用使用卷积的方法来计算。

由于希尔伯特变换的传输函数的傅里叶变换是 H(w)= -j w>=0j w<0所以我们可以先求原始信号的离散傅里叶变换E(K),然后按照下面的公式就可以求出希尔伯特变换之后的信号的离散傅里叶变换Eh (K)。

然后对Eh(K)求反傅里叶变换就可得到我们需要的信号的希尔伯特变换信号。

下面贴代码思路先建立一个复信号的结构体:typedef struct {Float64 r; /* 实部 */Float64 i; /* 虚部 */} CPX;接着是离散傅里叶变换的函数第一个参数dir代表正变换和反变换。

void DFT(int dir,int framelen,CPX *signal,CPX *dft_s){int i,k;double arg;double cosarg,sinarg;for(i=0;i<framelen;i++){arg=-dir*2.0*3.141592654*(double)i/(double)framelen;for(k=0;k<framelen;k++){cosarg=cos(k*arg);sinarg=sin(k*arg);dft_s[i].r+=(signal[k].r*cosarg-signal[k].i*sinarg);dft_s[i].i+=(signal[k].r*sinarg+signal[k].i*cosarg);}}/*返回数据*/if(dir==-1){for(i=0;i<framelen;i++){dft_s[i].r=dft_s[i].r/(double)framelen;dft_s[i].i=dft_s[i].i/(double)framelen;}}}上主函数int main(void){CPX *signal;CPX *dft_s;CPX *hdft_s;CPX *hsignal;signal=calloc(framelen,sizeof(CPX)); // 原始信号dft_s=calloc(framelen,sizeof(CPX)); // 原始信号的傅里叶变换hdft_s=calloc(framelen,sizeof(CPX)); // 希尔伯特变换的离散傅里叶变换hsignal=calloc(framelen,sizeof(CPX)); // 希尔伯特变换后信号DFT(1,framelen,signal, dft_s); //求原始信号傅里叶变换for(i=0;i<framelen;i++) //求出希尔伯特变换信号的傅里叶变换{if(i<=framelen/2){hdft_s[i].r=dft_s[i].i;hdft_s[i].i=-dft_s[i].r;}else{hdft_s[i].r=-dft_s[i].i;hdft_s[i].i=dft_s[i].r;}}DFT(-1,framelen, hdft_s,hsignal); //利用反傅里叶变换求出希尔伯特变换信号}最后这个hsignal就是我们要的希尔伯特变换信号了。

信号的希尔伯特变换

信号的希尔伯特变换

信号的希尔伯特变换
希尔伯特变换是一种在信号处理中广泛使用的数学工具,它可以将一个实数函数转换为复数函数。

这个变换有助于我们理解信号的频率特性和相位特性,并在许多应用中起着重要的作用。

在信号处理中,我们经常遇到各种类型的信号,比如声音、图像、视频等。

这些信号可以看作是时间的函数,而希尔伯特变换则可以将这些信号从时域转换到频域。

通过分析信号在频域中的特性,我们可以更好地理解信号的频率成分,从而对信号进行更精确的处理和分析。

希尔伯特变换的基本思想是将信号分解为不同频率的正弦波分量。

对于一个给定的信号,它可以表示为各个频率分量的叠加。

通过希尔伯特变换,我们可以将信号分解为不同频率分量的幅度和相位信息,从而更好地理解信号的频率特性和相位特性。

希尔伯特变换还可以用于信号的调制和解调。

在通信系统中,我们常常需要将信号调制到不同的频率,以便在不同的信道中传输。

通过希尔伯特变换,我们可以将信号的频率进行转换,并实现信号的调制和解调。

除了在通信系统中的应用,希尔伯特变换还广泛应用于音频处理、图像处理和视频处理等领域。

在音频处理中,希尔伯特变换可以用于音频合成、音频分析和音频特征提取等。

在图像处理和视频处理
中,希尔伯特变换可以用于边缘检测、纹理分析和运动估计等。

希尔伯特变换是一种重要的信号处理工具,它可以将信号从时域转换到频域,并提供了丰富的频率和相位信息。

通过希尔伯特变换,我们可以更好地理解信号的特性,并在各种应用中实现信号的处理和分析。

希尔伯特变换的应用范围广泛,对于提高信号处理的效果和性能具有重要意义。

希尔伯特变换 时域做法

希尔伯特变换 时域做法

希尔伯特变换时域做法全文共四篇示例,供读者参考第一篇示例:希尔伯特变换是一种在信号处理领域中常用的数学技术,它可以将一个实函数转换为其希尔伯特变换,该变换在时域上的做法可以帮助我们更好地理解信号的频率特性和相位信息。

在本文中,我们将重点介绍希尔伯特变换的时域做法,包括其定义、性质和应用。

一、希尔伯特变换的定义希尔伯特变换是一种线性、无失真的正交变换,它将一个实函数f(t)映射到其希尔伯特变换H[f(t)],其定义如下:H[f(t)](t)=\frac{1}{\pi}P.V.\int_{-\infty}^{\infty}\frac{f(\tau)}{t-\tau} d\tau其中P.V.表示柯西主值积分,实际上是在傅里叶变换的基础上引入一个负号,从而得到希尔伯特变换。

希尔伯特变换的本质是在频域上对信号进行一个90度相移,从而得到信号的解析信号。

1. 相位特性:希尔伯特变换能够将信号的相位进行90度的正交旋转,因此在频域上它实质上是一个高通滤波器,用于提取信号的高频信息。

2. 频率特性:希尔伯特变换在频域上是一个理想低通滤波器,其截止频率为0,可以保留信号的低频信息。

3. 平移不变性:希尔伯特变换对信号的平移具有不变性,即对信号进行时间平移,其希尔伯特变换也进行相应的时间平移。

4. 线性性质:希尔伯特变换是线性的,即对信号进行线性组合后的希尔伯特变换等于各部分的希尔伯特变换的线性组合。

5. 能量守恒:希尔伯特变换不改变信号的总能量,能量守恒在时域和频域上都成立。

希尔伯特变换在信号处理领域中有着广泛的应用,其中一些重要的应用包括:1. 医学图像处理:希尔伯特变换可以用于医学图像的处理和分析,例如用于图像的边缘检测、分割和特征提取等方面。

2. 通信系统:希尔伯特变换可以帮助设计和优化通信系统中的调制、解调、信道估计和误码纠正等算法。

3. 语音信号处理:希尔伯特变换可以用于语音信号的分析、合成和增强,有助于提高语音识别和合成的效果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关于希尔伯特变换的c语言实现
最近毕设需要用到希尔伯特变换的知识,今天做完之后决定还是记录下思路。

当然是数字信号的希尔伯特变换
上面是连续信号的希尔伯特变换,离散的应该也能根据上面写(没现成的图片,懒得编辑公式了)。

这里打算采用使用卷积的方法来计算。

由于希尔伯特变换的传输函数的傅里叶变换是H(w)= -j w&gt;=0
j w&lt;0
所以我们可以先求原始信号的离散傅里叶变换E(K),然后按照下面的公式就可以求出希尔伯特变换之后的信号的离散傅里叶变换Eh(K)。

然后对Eh(K)求反傅里叶变换就可得到我们需要的信号的希尔伯特变换信号。

下面贴代码思路
先建立一个复信号的结构体:
typedef struct {
Float64 r; /* 实部*/
Float64 i; /* 虚部*/
} CPX;接着是离散傅里叶变换的函数第一个参数dir代表正变换和反变换。

void DFT(int dir,int framelen,CPX *signal,CPX *dft_s)
{
int i,k;
double arg;
double cosarg,sinarg;for(i=0;i&lt;framelen;i++)
{
arg=-dir*2.0*3.141592654*(double)i/(double)framelen; for(k=0;k&lt;framelen;k++)
{
cosarg=cos(k*arg);
sinarg=sin(k*arg);
dft_s[i].r+=(signal[k].r*cosarg-signal[k].i*sinarg);
dft_s[i].i+=(signal[k].r*sinarg+signal[k].i*cosarg); }
}
/*返回数据*/
if(dir==-1)
{
for(i=0;i&lt;framelen;i++)
{
dft_s[i].r=dft_s[i].r/(double)framelen;
dft_s[i].i=dft_s[i].i/(double)framelen;
}}
}上主函数
int main(void)
{
CPX *signal;
CPX *dft_s;
CPX *hdft_s;
CPX *hsignal;signal=calloc(framelen,sizeof(CPX)); //
原始信号
dft_s=calloc(framelen,sizeof(CPX)); // 原始信号的傅里叶变换
hdft_s=calloc(framelen,sizeof(CPX)); // 希尔伯特变换的离散傅里叶变换
hsignal=calloc(framelen,sizeof(CPX)); // 希尔伯特变换后信号DFT(1,framelen,signal, dft_s); //求原始信号傅里叶变换for(i=0;i&lt;framelen;i++) //求出希尔伯特变换信号的傅里叶变换
{
if(i&lt;=framelen/2)
{
hdft_s[i].r=dft_s[i].i;
hdft_s[i].i=-dft_s[i].r;
}
else
{
hdft_s[i].r=-dft_s[i].i;
hdft_s[i].i=dft_s[i].r;
}
}
DFT(-1,framelen, hdft_s,hsignal); //利用反傅里叶变换求出希尔伯特变换信号}
最后这个hsignal就是我们要的希尔伯特变换信号了。

相关文档
最新文档