Signal
Signal 插件对四个基础的信号处理函数(离散正弦变换、离散余弦变换、离散小波变换、反离散小波变换)进行了封装。用户可以在 DolphinDB 数据库软件中加载该插件以使用这四个函数进行信号处理。 新增离散余弦变换的分布式版本。
Signal 插件目前支持版本:release200和release130。您当前查看的插件版本为 release200,请使用 DolphinDB 2.00.X 版本 server。若使用其它版本 server,请切换至相应插件分支。
构建
该插件使用 CMake 编译(version >= 3.10)
mkdir build
cd build
cmake ..
make
插件加载
编译生成 libPluginSignal.so 之后,通过以下脚本加载插件:
loadPlugin("/path/to/PluginSignal.txt");
API
signal::dct
对离散信号作离散余弦变换,返回变换序列
语法
signal::dct(X)
参数
- X:输入的离散信号序列,应当是一个 int 或 double 类型的 vector。
返回值
返回变换后的序列向量,与输入向量等长,元素类型为 double。
signal::dst
对离散信号作离散正弦变换,返回变换序列
语法
signal::dst(X)
参数
- X:输入的离散信号序列,应当是一个 int 或 double 类型的 vector。
返回值
返回变换后的序列向量,与输入向量等长,元素类型为 double。
signal::dwt
对离散信号作一维离散小波变换,返回由变换序列组成的 table。
语法
signal::dwt(X)
参数
- X:输入的离散信号序列,应当是一个 int 或 double 类型的 vector。
返回值
返回变换序列组成的 table,包含两个字段:cA,cD。cA 对应变换后的近似部分序列,cD 对应变换后的细节部分序列,两个序列等长。
signal::idwt
对一维离散小波变换得到的两个序列作逆变换,返回得到的信号序列
语法
signal::idwt(X,Y)
参数
- X:输入的近似部分序列(cA),应当是一个 int 或 double 类型的 vector。
- Y:输入的细节部分序列(cD),应当是一个 int 或 double 类型的 vector。
返回值
返回逆变换得到的信号序列。
signal::dctParallel
离散余弦变换的分布式版本,对离散信号作离散余弦变换,返回变换序列
语法
signal::dctParallel(ds)
参数
- ds:输入的数据源元组,包含若干个分区,分布在若干个控制节点中。
返回值
返回变换后的序列向量,与输入向量等长,元素类型为 double。
注意
由于 dctParallel
函数多用于多线程并发计算,为避免系统负载过高而严重影响性能,请勿多线程使用该函数。
signal::fft
一维快速傅立叶变换
语法
signal::fft(X,[n,norm])
参数
- X:要进行傅立叶变换的数据,类型为一维实数或复数 vector。
- n:傅立叶变换后输出向量的长度,默认为X的长度,类型为 int。
- norm:标准化模式,默认为 "backward" 不做标准化,"forward" 将变换结果乘以 1/n,"ortho"将变换结果乘以 1/sqrt(n),类型为string。
返回值
返回变换后长度为n的复数向量
signal::fft!
输入向量X可被覆盖的一维快速傅立叶变换。
注意
- 仅当 X 为复数且 X 长度不小于 n 时,X 前 n 项被输出覆盖。
- 语法、参数、返回值与
fft
相同。
signal::ifft
一维快速傅立叶逆变换
语法
signal::ifft(X,[n,norm])
参数
- X:要进行傅立叶变换的数据,类型为一维实数或复数 vector。
- n:傅立叶变换后输出向量的长度,默认为 X 的长度,类型为 int。
- norm:标准化模式,默认为 "backward",参数为 "forward" 时不做标准化,"backward" 将变换结果乘以 1/n,"ortho" 将变换结果乘以 1/sqrt(n),类型为 string。
返回值
返回变换后长度为n的复数向量
signal::ifft!
输入向量X可被覆盖的一维快速傅立叶逆变换。
注意
- 仅当 X 为复数且 X 长度不小于 n 时,X前n项被输出覆盖。
- 语法、参数、返回值与ifft相同。
signal::fft2
二维快速傅立叶变换
语法
signal::fft2(X,[s,norm])
参数
- X:要进行傅立叶变换的数据,类型为实数或复数矩阵。
- s:含有两个正整数的向量,分别对应傅立叶变换后输出矩阵的行数和列数,默认为 X 的行数和列数。
- norm:标准化模式,默认为 "backward" 不做标准化,设n为矩阵中元素的个数,则 "forward" 将变换结果乘以 1/n,"ortho" 将变换结果乘以 1/sqrt(n),类型为 string。
返回值
返回变换后行列数为s的复数矩阵
signal::fft2!
输入矩阵X可被覆盖的二维快速傅立叶变换。
注意
- 仅当X为复数矩阵且X行列数均不小于 s 时,X 被输出覆盖。
- 语法、参数、返回值与
fft2
相同。
signal::ifft2
二维快速傅立叶变换
语法
signal::ifft2(X,[s,norm])
参数
- X:要进行傅立叶变换的数据,类型为实数或复数矩阵。
- s:含有两个正整数的向量,分别对应傅立叶变换后输出矩阵的行数和列数,默认为 X 的行数和列数。
- norm:标准化模式,默认为 "backward"。设n为矩阵中元素的个数,则参数为 "forward" 时不做标准化,"backward" 将变换结果乘以 1/n,"ortho" 将变换结果乘以 1/sqrt(n),类型为string。
返回值
返回变换后行列数为 s 的复数矩阵
signal::ifft2!
输入矩阵 X 可被覆盖的二维快速傅立叶逆变换。
注意
- 仅当 X 为复数矩阵且 X 行列数均不小于 s 时,X 被输出覆盖。
- 语法、参数、返回值与
ifft2
相同。
signal::secc
波形互相关
语法
signal::secc(data,template,k[,moveout,weight])
参数
- data:波形数据,长为 l 一维实数向量。
- tempale:含有 n 段长为 m 波形数据的矩阵,每段数据存为矩阵中的一列,且 l 不小于 m。
- k:int 型参数,且 k 不小于 2*m,建议为 2 的幂次方。
- movetout:时差,长度为 n 的 double 型一维向量,默认为全为 0。
- weight:权重,长度为 n 的 double 型一维向量,默认为全为 1。
返回值
cccSum:含有 n 列的矩阵,每列长为 l-m+1,对应 template 的第 n 列与 data 互相关的结果。
signal::abs
对复数进行求模。
语法
signal::abs(data)
参数
- data:需要进行求的数据,类型为复数的 scalar 和 vector。
返回值
如果参数 data 为复数的 scalar,返回 double的 scalar。如果参数 data 为复数的 vector,返回 double 的 vector。
signal::mul
对复数进行乘法运算。
语法
signal::mul(data, num)
参数
- data:需要进行乘法的数据,类型为复数的 scalar 和 vector。
- num:乘数。类型为 double 的 scalar。
返回值
如果参数 data 为复数的 scalar,返回复数的 scalar。如果参数 data 为复数的 vector,返回复数的 vector。
示例
例1 dct 离散余弦变换
path="/path/to/PluginSignal.txt"
loadPlugin(path)
X = [1,2,3,4]
对信号作离散余弦变换:
> signal::dct(X)
[5,-2.23044235292127,-2.411540739456585E-7,-0.15851240125353]
例2 dst 离散正弦变换
path="/path/to/Pluginignal.txt"
loadPlugin(path)
X = [1,2,3,4]
对信号作离散正弦变换:
> signal::dst(X)
[15.388417979126893,-6.88190937668141,3.632712081813623,-1.624597646358306]
例3 dwt 离散小波变换
path="/path/to/PluginSignal.txt"
loadPlugin(path)
X = [1,2,3]
对信号作离散小波变换:
> signal::dwt(X)
cA cD
----------------- ------------------
2.121320343559643 -0.707106781186548
4.949747468305834 -0.707106781186548
例4 idwt 反离散小波变换
path="/path/to/PluginSignal.txt"
loadPlugin(path)
X = [2.121320343559643,4.949747468305834]
Y = [-0.707106781186548,-0.707106781186548]
对序列作反离散小波变换:
> signal::dwt(x,y)
[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 >)
loadPlugin("/path/to/PluginSignal.txt")
use signal
signal::dctParallel(ds);
例6 fft 一维快速傅立叶变换
path="/path/to/PluginSignal.txt"
loadPlugin(path)
X = [1,2,3,4]
对X作一维快速傅立叶变换:
>signal::fft(X);
[10+0i,-2+2i,-2+0i,-2-2i]
例7 ifft 一维快速傅立叶逆变换
path="/path/to/Pluginignal.txt"
loadPlugin(path)
X = [1,2,3,4]
对X作一维快速傅立叶逆变换:
>signal::ifft(X);
[2.5+0i,-0.5-0.5i,-0.5+0i,-0.5+0.5i]
例8 fft2 二维快速傅立叶变换
path="/path/to/Pluginignal.txt"
loadPlugin(path)
X = matrix([1,2,3,4],[4,3,2,1])
对X作二维快速傅立叶变换:
>fft2(X);
#0 #1
----- -----
20+0i 0+0i
0+0i -4+4i
0+0i -4+0i
0+0i -4-4i
例9 fft2 二维快速傅立叶逆变换
path="/path/to/Pluginignal.txt"
loadPlugin(path)
X = matrix([1,2,3,4],[4,3,2,1])
对X作二维快速傅立叶逆变换:
>ifft2(X);
#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 波形互相关
path="/path/to/Pluginignal.txt"
loadPlugin(path)
然后计算互相关
>x=[1, 2, 1, -1, 0, 3];
>y=matrix([1,3,2],[4,1,5]);
>secc(x,y,4);
#0 #1
------------------ -----------------
0.981980506061966 0.692934867183583
0.327326835353989 0.251976315339485
-0.377964473009227 0.327326835353989
0.422577127364258 0.536745040121693