signal
signal 插件集成了功能强大且性能高的 FFTW3 开源傅里叶变换库,为用户提供了便捷高效的傅里叶变换计算方式。该插件包含多种信号处理函数,如离散正弦变换、离散余弦变换和离散小波变换等。用户可以在DolphinDB 中加载该插件并使用这些信号处理功能。
安装插件
版本要求
DolphinDB Server 2.00.10 及更高版本。支持 Linux x64,Linux ARM。
安装步骤
- 在 DolphinDB 客户端中使用
listRemotePlugins
命令查看插件仓库中的插件信息。
注意:仅展示当前操作系统和 server 版本支持的插件。若无预期插件,可自行编译(请选择对应分支下的插件)或在 DolphinDB 用户社区进行反馈。
login("admin", "123456")
listRemotePlugins()
- 使用
installPlugin
命令完成插件安装。
installPlugin("signal")
- 使用
loadPlugin
命令加载插件。
loadPlugin("signal")
接口说明
dct
语法
signal::dct(X)
详情
对离散信号作离散余弦变换,并返回变换后的与输入向量等长的 DOUBLE 类型序列。
参数
X INT 或 DOUBLE 类型向量,表示输入的离散信号序列。
dst
语法
signal::dst(X)
详情
对离散信号作离散正弦变换,并返回变换后的与输入向量等长的 DOUBLE 类型序列。
参数
X INT 或 DOUBLE 类型向量,表示输入的离散信号序列。
dwt
语法
signal::dwt(X)
详情
对离散信号进行一维离散小波变换。返回由变换序列组成的 table,包含两个字段:cA,cD。cA 对应变换后的近似部分序列,cD 对应变换后的细节部分序列。
参数
X INT 或 DOUBLE 类型向量,表示输入的离散信号序列。
idwt
语法
signal::idwt(X,Y)
详情
对一维离散小波变换得到的两个序列进行逆变换,返回得到的信号序列。
参数
X INT 或 DOUBLE 类型向量,表示输入的近似部分序列(cA)。
Y INT 或 DOUBLE 类型向量,表示输入的细节部分序列(cD)。
dctParallel
语法
signal::dctParallel(ds)
详情
离散余弦变换的分布式版本,对离散信号作离散余弦变换,返回变换序列。由于 dctParallel
函数多用于多线程并发计算,为避免系统负载过高而严重影响性能,请勿多线程使用该函数。
参数
ds 数据源元组,表示输入的离散信号序列。ds 可以由 sqlDS
函数返回,包含若干个分区,分布在若干个控制节点中。
fft
语法
signal::fft(X,[n,norm])
详情
一维快速傅立叶变换,返回变换后长度为 n 的复数向量。
参数
X 实数或复数类型向量,表示要进行傅立叶变换的数据。
n INT类型标量,表示傅立叶变换后输出向量的长度,默认为 X 的长度。
norm STRING 类型标量,表示标准化模式,可取以下值:
- "backward"(默认值):不做标准化。
- "forward":将变换结果乘以 1/n。
- "ortho":将变换结果乘以 1/sqrt(n)。
fft!
语法
signal::fft!(X,[n,norm])
详情
一维快速傅立叶变换,计算结果覆盖 X 中原元素。注意,仅当 X 为复数且长度不小于 n 时,前 n 项被输出覆盖。
参数
与 fft
接口相同。
ifft
语法
signal::ifft(X,[n,norm])
详情
一维快速傅立叶逆变换,返回变换后长度为 n 的复数向量
参数
X 实数或复数类型向量,表示要进行傅立叶变换的数据。
n INT类型标量,表示傅立叶变换后输出向量的长度,默认为 X 的长度。
norm STRING 类型标量,表示标准化模式。可取以下值:
"backward"(默认值):将变换结果乘以 1/n。
"forward":不做标准化。
"ortho":将变换结果乘以 1/sqrt(n)。
ifft!
语法
signal::ifft!(X,[n,norm])
详情
一维快速傅立叶逆变换,计算结果覆盖 X 中原元素。注意,仅当 X 为复数且 X 长度不小于 n 时,前 n 项被输出覆盖。
参数
与 ifft
接口相同。
fft2
语法
signal::fft2(X,[s,norm])
详情
二维快速傅立叶变换,返回变换后的复数矩阵。
参数
X 实数或复数类型矩阵,表示要进行傅立叶变换的数据。
s 含有两个正整数的向量,分别表示对应傅立叶变换后输出矩阵的行数和列数,默认为 X 的行数和列数。
norm STRING 类型标量,表示标准化模式,可取以下值(设 n 为矩阵中元素的个数):
- "backward"(默认值):不做标准化。
- "forward":将变换结果乘以 1/n。
- "ortho":将变换结果乘以 1/sqrt(n)。
fft2!
语法
signal::fft2!(X,[s,norm])
详情
二维快速傅立叶变换,计算结果覆盖 X 中原元素。注意仅当 X 为复数矩阵且行列数均不小于 s 时,被输出覆盖。
参数
与 fft2
接口相同。
ifft2
语法
signal::ifft2(X,[s,norm])
详情
二维快速傅立叶逆变换,返回变换后的复数矩阵。
参数
X 实数或复数类型矩阵,表示要进行傅立叶变换的数据。
s 含有两个正整数的向量,分别表示对应傅立叶变换后输出矩阵的行数和列数,默认为 X 的行数和列数。
norm STRING 类型标量,表示标准化模式。可取以下值(设 n 为矩阵中元素的个数):
- "backward"(默认值):将变换结果乘以 1/n。
- "forward" :不做标准化。
- "ortho":将变换结果乘以 1/sqrt(n)。
ifft2!
语法
signal::ifft2!(X,[s,norm])
详情
二维快速傅立叶逆变换,计算结果覆盖 X 中原元素。注意仅当 X 为复数矩阵且行列数均不小于 s 时,被输出覆盖。
参数
与 ifft2
接口相同。
secc
语法
signal::secc(data,template,k,[moveout,weight])
详情
波形互相关,返回含有 n 列的矩阵,每列长为 l-m+1,对应 template 的第 n 列与 data 互相关的结果。
参数
data 长度为 l 的一维实数向量,表示波形数据。
template n 列m 行的实数矩阵,表示含有 n 段长为 m 的波形数据,每段数据存为矩阵中的一列,且 l 不小于m。
k INT 类型标量。k 不小于 2*m,建议为 2 的幂次方。
movetout 长度为 n 的 DOUBLE 类型向量,表示时差,默认全为 0。
weight 长度为 n 的 DOUBLE 类型向量,表示权重,默认全为 1。
abs
语法
signal::abs(data)
详情
对复数进行求模。如果 data 为复数标量,返回 DOUBLE 类型的标量。如果 data 为复数的向量,返回 DOUBLE 类型的向量。
参数
data 复数标量或向量,表示需要进行求模的数据。
mul
语法
signal::mul(data, num)
详情
对复数进行乘法运算。返回计算结果,结果形式与 data 相同。
参数
data 复数的标量或向量,表示需要进行乘法的数据。
num DOUBLE 类型标量,表示乘数。
3. 示例
在运行以下示例前,请先按照前文的“安装插件”步骤,完成 signal 插件的安装和加载。
例1 dct 离散余弦变换
X = [1,2,3,4]
signal::dct(X)
// output: [5,-2.23044235292127,-2.411540739456585E-7,-0.15851240125353]
例2 dst 离散正弦变换
X = [1,2,3,4]
signal::dst(X)
// output: [15.388417979126893,-6.88190937668141,3.632712081813623,-1.624597646358306]
例3 dwt 离散小波变换
X = [1,2,3]
signal::dwt(X)
// output:
cA cD
----------------- ------------------
2.121320343559643 -0.707106781186548
4.949747468305834 -0.707106781186548
例4 idwt 反离散小波变换
X = [2.121320343559643,4.949747468305834]
Y = [-0.707106781186548,-0.707106781186548]
signal::dwt(x,y)
// output: [1,2,3.000000000000001,4.000000000000001]
例5 dctParallel 离散余弦变换分布式版本
f1=0..9999
f2=1..10000
t=table(f1,f2)
db = database("dfs://rangedb_data", RANGE, 0 5000 10000)
signaldata = db.createPartitionedTable(t, "signaldata", "f1")
signaldata.append!(t)
signaldata=loadTable(db,"signaldata")
ds=sqlDS(<select * from signaldata >)
signal::dctParallel(ds);
例6 fft 一维快速傅立叶变换
X = [1,2,3,4]
signal::fft(X);
// output: [10+0i,-2+2i,-2+0i,-2-2i]
例7 ifft 一维快速傅立叶逆变换
X = [1,2,3,4]
signal::ifft(X);
// output: [2.5+0i,-0.5-0.5i,-0.5+0i,-0.5+0.5i]
例8 fft2 二维快速傅立叶变换
X = matrix([1,2,3,4],[4,3,2,1])
signal::fft2(X);
// output:
#0 #1
----- -----
20+0i 0+0i
0+0i -4+4i
0+0i -4+0i
0+0i -4-4i
例9 fft2 二维快速傅立叶逆变换
X = matrix([1,2,3,4],[4,3,2,1])
signal::ifft2(X);
// output:
#0 #1
------ ---------
2.5+0i 0+0i
0+0i -0.5-0.5i
0+0i -0.5+0i
0+0i -0.5+0.5i
例10 secc 波形互相关
x=[1, 2, 1, -1, 0, 3];
y=matrix([1,3,2],[4,1,5]);
signal::secc(x,y,4);
// output:
#0 #1
------------------ -----------------
0.981980506061966 0.692934867183583
0.327326835353989 0.251976315339485
-0.377964473009227 0.327326835353989
0.422577127364258 0.536745040121693