Repository navigation
Module_SignalProcessing_Signals_zh
Vorcyc.Mathematics.SignalProcessing.Signals 命名空间包含时域/频域信号定义与编辑工具。
0.9 推荐 API
| 类型 | 说明 |
|---|---|
Signal |
单线程时域实信号主类型:float 采样率、固定针脚缓冲、Samples 为 Span<float>,实现 ISingleThreadTimeDomainSignal
|
SignalSegment |
对父 Signal 的零拷贝片段 signal[start, length],用于帧级 SIMD 统计与特征 |
SignalExtensions |
信号编辑与帧统计扩展(替代已过时的 DiscreteSignalExtensions) |
ComplexDiscreteSignalFp32 |
复数离散信号(卷积、频域运算等) |
Signals.Generators.* |
0.9+ 逐样本生成器(ISampleGenerator)及 ToSignal / Fill 离线填充 |
兼容 / 过时
-
DiscreteSignal、DiscreteSignalExtensions:仍可用,已[Obsolete];请改用Signal/SignalExtensions或DiscreteSignal.ToSignal()。 - 旧版
Signals.Builders.*类型已移除;请使用Generators(生成器)(见迁移对照表)。 - 下文保留
DiscreteSignal章节供对照迁移;新代码请以 Signal 类 为准。
命名空间:Vorcyc.Mathematics.SignalProcessing.Signals.Generators
流式 / 离线波形合成。ISampleGenerator.NextSample() 逐样本生成;SampleGeneratorExtensions 可填充 Signal 或通过 ToSignal(length, samplingRate) 创建信号。
| 类型 | 说明 |
|---|---|
ISampleGenerator |
NextSample()、Reset()
|
IAmplitudeOscillator |
带 Frequency、Min、Max 的振荡器(继承 ISampleGenerator) |
SampleGeneratorExtensions |
Fill、ToSignal、SetLfoFrequency、SetLfoRange
|
SineOscillator / CosineOscillator
|
正弦 / 余弦 |
SquareOscillator / SawtoothOscillator / TriangleOscillator
|
方波 / 锯齿 / 三角 |
ChirpOscillator |
啁啾(频率扫描) |
SincGenerator / RampGenerator
|
Sinc 脉冲、线性斜坡 |
AwgnGenerator / WhiteNoiseGenerator / PinkNoiseGenerator / RedNoiseGenerator / PerlinNoiseGenerator
|
各类噪声 |
PulseWaveGenerator |
脉冲串 |
FadeInOutGenerator |
淡入淡出包装 |
AdsrEnvelope / AdsrState
|
ADSR 包络 |
WaveTableGenerator |
波表播放基类 |
KarplusStrongGenerator / KarplusStrongDrumGenerator
|
Karplus–Strong 弦 / 鼓 |
PadSynthGenerator |
Pad 合成 |
Builders → Generators 迁移对照(近似)
旧 Builders.*
|
改用 |
|---|---|
SineBuilder |
SineOscillator + ToSignal
|
ChirpBuilder |
ChirpOscillator |
AdsrBuilder |
AdsrEnvelope |
WhiteNoiseBuilder / PinkNoiseBuilder / … |
对应 *NoiseGenerator
|
KarplusStrongBuilder |
KarplusStrongGenerator |
示例:
using Vorcyc.Mathematics.SignalProcessing.Signals;
using Vorcyc.Mathematics.SignalProcessing.Signals.Generators;
var gen = new SineOscillator(frequency: 440f, samplingRate: 48_000f);
Signal tone = gen.ToSignal(length: 48_000, samplingRate: 48_000f);对已有 Signal / DiscreteSignal 做一次性填充时,使用 GenerateWave(WaveShape, frequency, Behaviour)(ITimeDomainSignal 扩展)。波形映射到上方生成器:
WaveShape |
说明 |
|---|---|
Sine / Cosine / Square / Sawtooth / Triangle
|
周期波;frequency 为 Hz |
WhiteNoise / PinkNoise / RedNoise / Awgn
|
噪声;frequency 忽略(AWGN 使用固定默认 σ)。0.10.14:PinkNoise 走 Paul Kellet PinkNoiseGenerator(约 ±1;旧自定义 IIR 已移除) |
Chirp |
线性啁啾;frequency 为起始 Hz(终止默认为 min(f×10, 0.45×Nyquist)) |
Pulse |
frequency Hz 脉冲串,占空比 50% |
Ramp |
缓冲区内 −1…+1 线性斜坡;frequency 忽略 |
Sinc |
缩放 sinc;frequency 控制宽度(同 SincGenerator.Frequency) |
var chirp = new Signal(48_000, 48_000f);
chirp.GenerateWave(WaveShape.Chirp, frequency: 100f);以下类型位于命名空间:
Vorcyc.Mathematics.SignalProcessing.Signals
📒目录
- 🔖 Generators(生成器,0.9+)
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.Signal 类
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.SignalSegment 结构
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.SignalExtensions 类
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignalFp32 类
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignal 类
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignalExtensions 类
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.DiscreteSignal 类
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.DiscreteSignal 类
- 🔖 Vorcyc.Mathematics.SignalProcessing.Signals.DiscreteSignalExtensions 类(已过时)
Signal 是 0.9 起推荐的单线程实值时域信号类型。样本存放在 POHBuffer<float> 中,通过 Samples 属性以 Span<float> 暴露,修改后需调用 NotifySamplesModified() 以失效缓存的时域特征。
| 成员 | 说明 |
|---|---|
Signal(int sampleCount, float samplingRate) |
按样本数与采样率分配缓冲 |
Signal(TimeSpan duration, float samplingRate) |
按时长与采样率分配缓冲 |
Signal.Unit(int length, float samplingRate) |
单位脉冲(首样本为 1) |
Signal.Constant(float value, int length, float samplingRate) |
常数信号 |
Signal.FromCopy(ReadOnlySpan<float>, float) |
从 span 拷贝构造 |
Signal.FromCopy(float[], float) |
从数组拷贝构造 |
-
Length、SamplingRate(float)、Duration -
Samples:Span<float>可读写视图 - 时域特征(带 SIMD 缓存):
Amplitude、TotalPower、AveragePower、TotalEnergy、AverageEnergy、Rms、ZeroCrossingRate、Entropy
-
this[int start, int length]→SignalSegment?零拷贝片段 -
this[Range range]、this[TimeSpan start, TimeSpan duration] -
Clone()、CloneRange(int start, int length)
-
TransformToFrequencyDomain(ComputingContext?, WindowType?)→FrequencyDomain(推荐;SIMD/并行划算时走 SoAFftButterflyFp32) -
FrequencyDomain.IndexToFrequency:0.10.15 起按TransformLength(FFT 长度)映射;onesided 幅值 bin0…N/2恒为非负bin·Δf(勿再误用未补零的ActualLength) -
ISingleThreadTimeDomainSignal.GetRms(context)等时域特征(可选执行策略) -
Resample(float destinationSamplingRate, FirFilter?, int order)→ 新Signal
+、-、*、/(标量与同形状 Signal 逐样本运算,返回新 Signal)
using Vorcyc.Mathematics.SignalProcessing.Signals;
var signal = new Signal(1024, 8000f);
signal.GenerateWave(WaveShape.Sine, 440f);
var frame = signal[256, 512, throwException: true]!.Value;
Console.WriteLine($"Frame RMS: {frame.Rms}");
var copy = signal.CloneRange(0, 256);只读结构体,表示父 Signal 上连续样本的零拷贝视图。实现 ITimeDomainSignal / ISingleThreadTimeDomainSignal,帧级 Rms、AverageEnergy、ZeroCrossingRate、Entropy 等通过 SIMD 延迟计算。
- 由
signal[start, length]或signal[range]获得 -
Samples为指向父缓冲子区间的Span<float> - 可独立调用
TransformToFrequencyDomain、Resample
自 DiscreteSignalExtensions 迁移的静态扩展方法(新代码请用本类)。
| 方法 | 说明 |
|---|---|
First / Last
|
取前/后 n 个样本(新 Signal) |
Amplify / Attenuate / Reverse
|
原地增益/反转 |
NormalizeMax |
按峰值归一化到 [-1, 1] |
Delay |
延迟副本(正 delay 延长,负 delay 截断左移) |
Concatenate / Repeat
|
连接 / 重复 |
Superimpose / SuperimposeMany / Subtract
|
叠加与相减(支持不等长广播) |
FullRectify / HalfRectify
|
原地整流 |
FadeIn / FadeOut / FadeInFadeOut
|
线性淡入淡出(double 秒或 TimeSpan) |
Crossfade |
两信号交叉淡化 |
ToComplex |
转为 ComplexDiscreteSignalFp32(虚部为零) |
Energy / Rms / ZeroCrossingRate / Entropy
|
区间统计(Signal 或 ReadOnlySpan<float>) |
var a = Signal.Constant(1f, 100, 8000f);
var b = Signal.Constant(0.5f, 100, 8000f);
var mixed = a.Superimpose(b);
a.FadeIn(0.01);
a.FadeOut(0.01);
var joined = a.Crossfade(b, 0.005);以下类型均位于 Vorcyc.Mathematics.SignalProcessing.Signals 命名空间。
Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignalFp32 是一个用于表示有限复数值离散时间信号的类。信号以一定的采样率存储为两个数据数组(实部和虚部)。
-
public int SamplingRate { get; }- 获取采样率(每秒的样本数)。
-
public float[] Real { get; }- 获取复数值样本的实部。
-
public float[] Imag { get; }- 获取复数值样本的虚部。
-
public int Length => Real.Length- 获取信号的长度。
-
public float[] Magnitude- 获取复数值样本的幅度。
-
public float[] Power- 获取复数值样本的功率(幅度的平方)。
-
public float[] Phase- 获取复数值样本的相位。
-
public float[] PhaseUnwrapped- 获取复数值样本的展开相位。
-
public ComplexDiscreteSignalFp32(int samplingRate, float[] real, float[] imag = null, bool allocateNew = false)- 使用实部和虚部数组构造 ComplexDiscreteSignalFp32 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
real: 复数值信号的实部数组。 -
imag: 复数值信号的虚部数组,默认为 null。 -
allocateNew: 如果应为数据分配新内存,则设置为 true,默认为 false。
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<float> real, IEnumerable<float> imag = null)- 使用实部和虚部集合构造 ComplexDiscreteSignalFp32 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
real: 复数值信号的实部集合。 -
imag: 复数值信号的虚部集合,默认为 null。
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<ComplexFp32> samples)- 使用复数值样本集合构造 ComplexDiscreteSignalFp32 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
samples: 复数值样本集合。
-
-
public ComplexDiscreteSignalFp32(int samplingRate, int length, float real = 0.0f, float imag = 0.0f)- 构造具有指定长度并填充指定值的信号。
- 参数:
-
samplingRate: 信号的采样率。 -
length: 样本数。 -
real: 每个样本的实部值,默认为 0.0。 -
imag: 每个样本的虚部值,默认为 0.0。
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<int> samples, float normalizeFactor = 1.0f)- 使用整数样本集合构造信号,并在给定采样率下进行归一化。
- 参数:
-
samplingRate: 信号的采样率。 -
samples: 整数样本集合。 -
normalizeFactor: 每个样本将除以此值,默认为 1.0。
-
-
public ComplexDiscreteSignalFp32 Copy()- 创建信号的深拷贝。
- 返回值: 信号的深拷贝。
-
public float this[int index] { get; set; }- 样本索引器。仅适用于样本实部数组。谨慎使用。
- 参数:
-
index: 样本索引。
-
- 返回值: 样本的实部值。
-
public ComplexDiscreteSignalFp32 this[int startPos, int endPos] { get; }- 创建信号的切片。
- 参数:
-
startPos: 第一个样本的索引(包含)。 -
endPos: 最后一个样本的索引(不包含)。
-
- 返回值: 信号的切片。
-
public static ComplexDiscreteSignalFp32 operator +(ComplexDiscreteSignalFp32 s1, ComplexDiscreteSignalFp32 s2)- 通过叠加信号 s1 和 s2 创建新信号。如果大小不同,则较小的信号将广播以适应较大的信号大小。
- 参数:
-
s1: 第一个信号。 -
s2: 第二个信号。
-
- 返回值: 叠加后的新信号。
-
public static ComplexDiscreteSignalFp32 operator +(ComplexDiscreteSignalFp32 s, float constant)- 通过将常数添加到信号 s 创建新信号。
- 参数:
-
s: 信号。 -
constant: 要添加到每个样本的常数。
-
- 返回值: 添加常数后的新信号。
-
public static ComplexDiscreteSignalFp32 operator -(ComplexDiscreteSignalFp32 s, float constant)- 通过从信号 s 中减去常数创建新信号。
- 参数:
-
s: 信号。 -
constant: 要从每个样本中减去的常数。
-
- 返回值: 减去常数后的新信号。
-
public static ComplexDiscreteSignalFp32 operator *(ComplexDiscreteSignalFp32 s, float coeff)- 通过将信号 s 乘以系数(放大/衰减)创建新信号。
- 参数:
-
s: 信号。 -
coeff: 放大/衰减系数。
-
- 返回值: 乘以系数后的新信号。
以下是一个使用 ComplexDiscreteSignalFp32 类中多个方法的示例,并在示例中加入了注释:
using System;
using Vorcyc.Mathematics.SignalProcessing.Signals;
public class ComplexDiscreteSignalExample
{
public static void Main()
{
// 定义采样率
int samplingRate = 44100;
// 定义实部和虚部数组
float[] real = { 0.5f, 0.6f, 0.55f };
float[] imag = { 0.1f, 0.2f, 0.15f };
// 创建 ComplexDiscreteSignalFp32 实例
var signal = new ComplexDiscreteSignalFp32(samplingRate, real, imag);
// 输出信号的实部和虚部
Console.WriteLine("Real Parts:");
foreach (var r in signal.Real)
{
Console.WriteLine(r);
}
Console.WriteLine("Imaginary Parts:");
foreach (var i in signal.Imag)
{
Console.WriteLine(i);
}
// 获取并输出信号的幅度
var magnitude = signal.Magnitude;
Console.WriteLine("Magnitude:");
foreach (var m in magnitude)
{
Console.WriteLine(m);
}
// 获取并输出信号的相位
var phase = signal.Phase;
Console.WriteLine("Phase:");
foreach (var p in phase)
{
Console.WriteLine(p);
}
// 创建信号的切片
var slicedSignal = signal[1, 3];
Console.WriteLine("Sliced Signal Real Parts:");
foreach (var r in slicedSignal.Real)
{
Console.WriteLine(r);
}
// 创建信号的深拷贝
var copiedSignal = signal.Copy();
Console.WriteLine("Copied Signal Real Parts:");
foreach (var r in copiedSignal.Real)
{
Console.WriteLine(r);
}
}
}Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignal<T> 是一个用于表示有限复数值离散时间信号的类。信号以一定的采样率存储为两个数据数组(实部和虚部)。
-
public int SamplingRate { get; }- 获取采样率(每秒的样本数)。
-
public T[] Real { get; }- 获取复数值样本的实部。
-
public T[] Imag { get; }- 获取复数值样本的虚部。
-
public int Length => Real.Length- 获取信号的长度。
-
public T[] Magnitude- 获取复数值样本的幅度。
-
public T[] Power- 获取复数值样本的功率(幅度的平方)。
-
public T[] Phase- 获取复数值样本的相位。
-
public T[] PhaseUnwrapped- 获取复数值样本的展开相位。
-
public ComplexDiscreteSignalFp32(int samplingRate, T[] real, T[]? imag = null, bool allocateNew = false)- 使用实部和虚部数组构造 ComplexDiscreteSignalFp32 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
real: 复数值信号的实部数组。 -
imag: 复数值信号的虚部数组,默认为 null。 -
allocateNew: 如果应为数据分配新内存,则设置为 true,默认为 false。
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<T> real, IEnumerable<T>? imag = null)- 使用实部和虚部集合构造 ComplexDiscreteSignalFp32 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
real: 复数值信号的实部集合。 -
imag: 复数值信号的虚部集合,默认为 null。
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<Complex<T>> samples)- 使用复数值样本集合构造 ComplexDiscreteSignalFp32 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
samples: 复数值样本集合。
-
-
public ComplexDiscreteSignalFp32(int samplingRate, int length, T real = default, T imag = default)- 构造具有指定长度并填充指定值的信号。
- 参数:
-
samplingRate: 信号的采样率。 -
length: 样本数。 -
real: 每个样本的实部值,默认为 0.0。 -
imag: 每个样本的虚部值,默认为 0.0。
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<T> samples, T? normalizeFactor = null)- 使用整数样本集合构造信号,并在给定采样率下进行归一化。
- 参数:
-
samplingRate: 信号的采样率。 -
samples: 整数样本集合。 -
normalizeFactor: 每个样本将除以此值,默认为 1.0。
-
-
public ComplexDiscreteSignal<T> Copy()- 创建信号的深拷贝。
- 返回值: 信号的深拷贝。
-
public T this[int index] { get; set; }- 样本索引器。仅适用于样本实部数组。谨慎使用。
- 参数:
-
index: 样本索引。
-
- 返回值: 样本的实部值。
-
public ComplexDiscreteSignal<T> this[int startPos, int endPos] { get; }- 创建信号的切片。
- 参数:
-
startPos: 第一个样本的索引(包含)。 -
endPos: 最后一个样本的索引(不包含)。
-
- 返回值: 信号的切片。
-
public static ComplexDiscreteSignal<T> operator +(ComplexDiscreteSignal<T> s1, ComplexDiscreteSignal<T> s2)- 通过叠加信号 s1 和 s2 创建新信号。如果大小不同,则较小的信号将广播以适应较大的信号大小。
- 参数:
-
s1: 第一个信号。 -
s2: 第二个信号。
-
- 返回值: 叠加后的新信号。
-
public static ComplexDiscreteSignal<T> operator +(ComplexDiscreteSignal<T> s, T constant)- 通过将常数添加到信号 s 创建新信号。
- 参数:
-
s: 信号。 -
constant: 要添加到每个样本的常数。
-
- 返回值: 添加常数后的新信号。
-
public static ComplexDiscreteSignal<T> operator -(ComplexDiscreteSignal<T> s, T constant)- 通过从信号 s 中减去常数创建新信号。
- 参数:
-
s: 信号。 -
constant: 要从每个样本中减去的常数。
-
- 返回值: 减去常数后的新信号。
-
public static ComplexDiscreteSignal<T> operator *(ComplexDiscreteSignal<T> s, T coeff)- 通过将信号 s 乘以系数(放大/衰减)创建新信号。
- 参数:
-
s: 信号。 -
coeff: 放大/衰减系数。
-
- 返回值: 乘以系数后的新信号。
以下是一个使用 ComplexDiscreteSignal 类中多个方法的示例,并在示例中加入了注释:
using System;
using Vorcyc.Mathematics.SignalProcessing.Signals;
public class ComplexDiscreteSignalExample
{
public static void Main()
{
// 定义采样率
int samplingRate = 44100;
// 定义实部和虚部数组
float[] real = { 0.5f, 0.6f, 0.55f };
float[] imag = { 0.1f, 0.2f, 0.15f };
// 创建 ComplexDiscreteSignalFp32 实例
var signal = new ComplexDiscreteSignal<float>(samplingRate, real, imag);
// 输出信号的实部和虚部
Console.WriteLine("Real Parts:");
foreach (var r in signal.Real)
{
Console.WriteLine(r);
}
Console.WriteLine("Imaginary Parts:");
foreach (var i in signal.Imag)
{
Console.WriteLine(i);
}
// 获取并输出信号的幅度
var magnitude = signal.Magnitude;
Console.WriteLine("Magnitude:");
foreach (var m in magnitude)
{
Console.WriteLine(m);
}
// 获取并输出信号的相位
var phase = signal.Phase;
Console.WriteLine("Phase:");
foreach (var p in phase)
{
Console.WriteLine(p);
}
// 创建信号的切片
var slicedSignal = signal[1, 3];
Console.WriteLine("Sliced Signal Real Parts:");
foreach (var r in slicedSignal.Real)
{
Console.WriteLine(r);
}
// 创建信号的深拷贝
var copiedSignal = signal.Copy();
Console.WriteLine("Copied Signal Real Parts:");
foreach (var r in copiedSignal.Real)
{
Console.WriteLine(r);
}
}
}Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignalExtensions 提供了用于处理复数离散信号的扩展方法。
-
public static ComplexDiscreteSignalFp32 Delay(this ComplexDiscreteSignalFp32 signal, int delay)- 创建
signal的延迟副本,通过将其向右(正delay)或向左(负delay)移动。 - 参数:
-
signal: 信号。 -
delay: 延迟(正数或负数的延迟样本数)。
-
- 返回值: 延迟后的
ComplexDiscreteSignalFp32。
- 创建
-
public static ComplexDiscreteSignal<T> Delay<T>(this ComplexDiscreteSignal<T> signal, int delay) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- 创建
signal的延迟副本,通过将其向右(正delay)或向左(负delay)移动。 - 参数:
-
signal: 信号。 -
delay: 延迟(正数或负数的延迟样本数)。
-
- 返回值: 延迟后的
ComplexDiscreteSignal<T>。
- 创建
-
public static ComplexDiscreteSignalFp32 Superimpose(this ComplexDiscreteSignalFp32 signal1, ComplexDiscreteSignalFp32 signal2)- 叠加
signal1和signal2。如果大小不同,则较小的信号将广播以适应较大的信号大小。 - 参数:
-
signal1: 第一个信号。 -
signal2: 第二个信号。
-
- 返回值: 叠加后的
ComplexDiscreteSignalFp32。
- 叠加
-
public static ComplexDiscreteSignal<T> Superimpose<T>(this ComplexDiscreteSignal<T> signal1, ComplexDiscreteSignal<T> signal2) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- 叠加
signal1和signal2。如果大小不同,则较小的信号将广播以适应较大的信号大小。 - 参数:
-
signal1: 第一个信号。 -
signal2: 第二个信号。
-
- 返回值: 叠加后的
ComplexDiscreteSignal<T>。
- 叠加
-
public static ComplexDiscreteSignalFp32 Concatenate(this ComplexDiscreteSignalFp32 signal1, ComplexDiscreteSignalFp32 signal2)- 连接
signal1和signal2。 - 参数:
-
signal1: 第一个信号。 -
signal2: 第二个信号。
-
- 返回值: 连接后的
ComplexDiscreteSignalFp32。
- 连接
-
public static ComplexDiscreteSignal<T> Concatenate<T>(this ComplexDiscreteSignal<T> signal1, ComplexDiscreteSignal<T> signal2) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- 连接
signal1和signal2。 - 参数:
-
signal1: 第一个信号。 -
signal2: 第二个信号。
-
- 返回值: 连接后的
ComplexDiscreteSignal<T>。
- 连接
-
public static ComplexDiscreteSignalFp32 Repeat(this ComplexDiscreteSignalFp32 signal, int n)- 创建
signal的副本,并重复n次。 - 参数:
-
signal: 信号。 -
n: 重复次数。
-
- 返回值: 重复后的
ComplexDiscreteSignalFp32。
- 创建
-
public static ComplexDiscreteSignal<T> Repeat<T>(this ComplexDiscreteSignal<T> signal, int n) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- 创建
signal的副本,并重复n次。 - 参数:
-
signal: 信号。 -
n: 重复次数。
-
- 返回值: 重复后的
ComplexDiscreteSignal<T>。
- 创建
-
public static void Amplify(this ComplexDiscreteSignalFp32 signal, float coeff)- 按
coeff放大signal。 - 参数:
-
signal: 信号。 -
coeff: 放大系数。
-
- 按
-
public static void Amplify<T>(this ComplexDiscreteSignal<T> signal, T coeff) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- 按
coeff放大signal。 - 参数:
-
signal: 信号。 -
coeff: 放大系数。
-
- 按
-
public static void Attenuate(this ComplexDiscreteSignalFp32 signal, float coeff)- 按
coeff衰减signal。 - 参数:
-
signal: 信号。 -
coeff: 衰减系数。
-
- 按
-
public static void Attenuate<T>(this ComplexDiscreteSignal<T> signal, T coeff) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- 按
coeff衰减signal。 - 参数:
-
signal: 信号。 -
coeff: 衰减系数。
-
- 按
-
public static ComplexDiscreteSignalFp32 First(this ComplexDiscreteSignalFp32 signal, int n)- 从
signal的前n个样本创建新信号。 - 参数:
-
signal: 信号。 -
n: 样本数。
-
- 返回值: 新的
ComplexDiscreteSignalFp32。
- 从
-
public static ComplexDiscreteSignal<T> First<T>(this ComplexDiscreteSignal<T> signal, int n) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- 从
signal的前n个样本创建新信号。 - 参数:
-
signal: 信号。 -
n: 样本数。
-
- 返回值: 新的
ComplexDiscreteSignal<T>。
- 从
-
public static ComplexDiscreteSignalFp32 Last(this ComplexDiscreteSignalFp32 signal, int n)- 从
signal的后n个样本创建新信号。 - 参数:
-
signal: 信号。 -
n: 样本数。
-
- 返回值: 新的
ComplexDiscreteSignalFp32。
- 从
-
public static ComplexDiscreteSignal<T> Last<T>(this ComplexDiscreteSignal<T> signal, int n) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- 从
signal的后n个样本创建新信号。 - 参数:
-
signal: 信号。 -
n: 样本数。
-
- 返回值: 新的
ComplexDiscreteSignal<T>。
- 从
-
public static ComplexDiscreteSignalFp32 ZeroPadded(this ComplexDiscreteSignalFp32 signal, int length)- 从
signal创建新的零填充复数离散信号。 - 参数:
-
signal: 信号。 -
length: 零填充信号的长度。
-
- 返回值: 零填充后的
ComplexDiscreteSignalFp32。
- 从
-
public static ComplexDiscreteSignal<T> ZeroPadded<T>(this ComplexDiscreteSignal<T> signal, int length) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- 从
signal创建新的零填充复数离散信号。 - 参数:
-
signal: 信号。 -
length: 零填充信号的长度。
-
- 返回值: 零填充后的
ComplexDiscreteSignal<T>。
- 从
-
public static ComplexDiscreteSignalFp32 Multiply(this ComplexDiscreteSignalFp32 signal1, ComplexDiscreteSignalFp32 signal2)- 执行
signal1和signal2的复数乘法(按长度归一化)。 - 参数:
-
signal1: 第一个信号。 -
signal2: 第二个信号。
-
- 返回值: 乘法后的
ComplexDiscreteSignalFp32。
- 执行
-
public static ComplexDiscreteSignal<T> Multiply<T>(this ComplexDiscreteSignal<T> signal1, ComplexDiscreteSignal<T> signal2) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- 执行
signal1和signal2的复数乘法(按长度归一化)。 - 参数:
-
signal1: 第一个信号。 -
signal2: 第二个信号。
-
- 返回值: 乘法后的
ComplexDiscreteSignal<T>。
- 执行
-
public static ComplexDiscreteSignalFp32 Divide(this ComplexDiscreteSignalFp32 signal1, ComplexDiscreteSignalFp32 signal2)- 执行
signal1和signal2的复数除法(按长度归一化)。 - 参数:
-
signal1: 第一个信号。 -
signal2: 第二个信号。
-
- 返回值: 除法后的
ComplexDiscreteSignalFp32。
- 执行
-
public static ComplexDiscreteSignal<T> Divide<T>(this ComplexDiscreteSignal<T> signal1, ComplexDiscreteSignal<T> signal2) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- 执行
signal1和signal2的复数除法(按长度归一化)。 - 参数:
-
signal1: 第一个信号。 -
signal2: 第二个信号。
-
- 返回值: 除法后的
ComplexDiscreteSignal<T>。
- 执行
-
public static float[] Unwrap(this float[] phase, float tolerance = ConstantsFp32.PI)- 展开复数值样本的相位。
- 参数:
-
phase: 相位。 -
tolerance: 跳跃大小,默认为ConstantsFp32.PI。
-
- 返回值: 展开后的相位数组。
-
public static T[] Unwrap<T>(this T[] phase, T? tolerance = null) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- 展开复数值样本的相位。
- 参数:
-
phase: 相位。 -
tolerance: 跳跃大小,默认为T.Pi。
-
- 返回值: 展开后的相位数组。
-
public static IEnumerable<ComplexFp32> ToComplexNumbers(this ComplexDiscreteSignalFp32 signal)- 从
signal样本中生成复数。 - 参数:
-
signal: 复数离散信号。
-
- 返回值: 复数序列。
- 从
-
public static IEnumerable<Complex<T>> ToComplexNumbers<T>(this ComplexDiscreteSignal<T> signal) where T : unmanaged, IFloatingPointIeee754<T>, IMinMaxValue<T>- 从
signal样本中生成复数。 - 参数:
-
signal: 复数离散信号。
-
- 返回值: 复数序列。
- 从
以下是一个使用 ComplexDiscreteSignalExtensions 类中多个方法的示例,并在示例中加入了注释:
using System;
using Vorcyc.Mathematics.SignalProcessing.Signals;
public class ComplexDiscreteSignalExtensionsExample
{
public static void Main()
{
// 定义采样率
int samplingRate = 44100;
// 定义实部和虚部数组
float[] real = { 0.5f, 0.6f, 0.55f };
float[] imag = { 0.1f, 0.2f, 0.15f };
// 创建 ComplexDiscreteSignalFp32 实例
var signal = new ComplexDiscreteSignalFp32(samplingRate, real, imag);
// 创建延迟信号
var delayedSignal = signal.Delay(2);
Console.WriteLine("Delayed Signal Real Parts:");
foreach (var r in delayedSignal.Real)
{
Console.WriteLine(r);
}
// 叠加信号
var superimposedSignal = signal.Superimpose(delayedSignal);
Console.WriteLine("Superimposed Signal Real Parts:");
foreach (var r in superimposedSignal.Real)
{
Console.WriteLine(r);
}
// 连接信号
var concatenatedSignal = signal.Concatenate(delayedSignal);
Console.WriteLine("Concatenated Signal Real Parts:");
foreach (var r in concatenatedSignal.Real)
{
Console.WriteLine(r);
}
// 放大信号
signal.Amplify(2.0f);
Console.WriteLine("Amplified Signal Real Parts:");
foreach (var r in signal.Real)
{
Console.WriteLine(r);
}
// 衰减信号
signal.Attenuate(2.0f);
Console.WriteLine("Attenuated Signal Real Parts:");
foreach (var r in signal.Real)
{
Console.WriteLine(r);
}
// 获取前 n 个样本
var firstSamples = signal.First(2);
Console.WriteLine("First Samples Real Parts:");
foreach (var r in firstSamples.Real)
{
Console.WriteLine(r);
}
// 获取后 n 个样本
var lastSamples = signal.Last(2);
Console.WriteLine("Last Samples Real Parts:");
foreach (var r in lastSamples.Real)
{
Console.WriteLine(r);
}
// 零填充信号
var zeroPaddedSignal = signal.ZeroPadded(8);
Console.WriteLine("Zero Padded Signal Real Parts:");
foreach (var r in zeroPaddedSignal.Real)
{
Console.WriteLine(r);
}
// 复数乘法
var multipliedSignal = signal.Multiply(delayedSignal);
Console.WriteLine("Multiplied Signal Real Parts:");
foreach (var r in multipliedSignal.Real)
{
Console.WriteLine(r);
}
// 复数除法
var dividedSignal = signal.Divide(delayedSignal);
Console.WriteLine("Divided Signal Real Parts:");
foreach (var r in dividedSignal.Real)
{
Console.WriteLine(r);
}
// 展开相位
var unwrappedPhase = signal.Phase.Unwrap();
Console.WriteLine("Unwrapped Phase:");
foreach (var p in unwrappedPhase)
{
Console.WriteLine(p);
}
// 转换为复数
var complexNumbers = signal.ToComplexNumbers();
Console.WriteLine("Complex Numbers:");
foreach (var c in complexNumbers)
{
Console.WriteLine($"Real: {c.Real}, Imaginary: {c.Imaginary}");
}
}
}Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignal<T> 是一个用于表示有限复数值离散时间信号的类。信号以一定的采样率存储为两个数据数组(实部和虚部)。
-
public int SamplingRate { get; }- 获取采样率(每秒的样本数)。
-
public T[] Real { get; }- 获取复数值样本的实部。
-
public T[] Imag { get; }- 获取复数值样本的虚部。
-
public int Length => Real.Length- 获取信号的长度。
-
public T[] Magnitude- 获取复数值样本的幅度。
-
public T[] Power- 获取复数值样本的功率(幅度的平方)。
-
public T[] Phase- 获取复数值样本的相位。
-
public T[] PhaseUnwrapped- 获取复数值样本的展开相位。
-
public ComplexDiscreteSignalFp32(int samplingRate, T[] real, T[]? imag = null, bool allocateNew = false)- 使用实部和虚部数组构造 ComplexDiscreteSignalFp32 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
real: 复数值信号的实部数组。 -
imag: 复数值信号的虚部数组,默认为 null。 -
allocateNew: 如果应为数据分配新内存,则设置为 true,默认为 false。
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<T> real, IEnumerable<T>? imag = null)- 使用实部和虚部集合构造 ComplexDiscreteSignalFp32 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
real: 复数值信号的实部集合。 -
imag: 复数值信号的虚部集合,默认为 null。
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<Complex<T>> samples)- 使用复数值样本集合构造 ComplexDiscreteSignalFp32 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
samples: 复数值样本集合。
-
-
public ComplexDiscreteSignalFp32(int samplingRate, int length, T real = default, T imag = default)- 构造具有指定长度并填充指定值的信号。
- 参数:
-
samplingRate: 信号的采样率。 -
length: 样本数。 -
real: 每个样本的实部值,默认为 0.0。 -
imag: 每个样本的虚部值,默认为 0.0。
-
-
public ComplexDiscreteSignalFp32(int samplingRate, IEnumerable<T> samples, T? normalizeFactor = null)- 使用整数样本集合构造信号,并在给定采样率下进行归一化。
- 参数:
-
samplingRate: 信号的采样率。 -
samples: 整数样本集合。 -
normalizeFactor: 每个样本将除以此值,默认为 1.0。
-
-
public ComplexDiscreteSignal<T> Copy()- 创建信号的深拷贝。
- 返回值: 信号的深拷贝。
-
public T this[int index] { get; set; }- 样本索引器。仅适用于样本实部数组。谨慎使用。
- 参数:
-
index: 样本索引。
-
- 返回值: 样本的实部值。
-
public ComplexDiscreteSignal<T> this[int startPos, int endPos] { get; }- 创建信号的切片。
- 参数:
-
startPos: 第一个样本的索引(包含)。 -
endPos: 最后一个样本的索引(不包含)。
-
- 返回值: 信号的切片。
-
public static ComplexDiscreteSignal<T> operator +(ComplexDiscreteSignal<T> s1, ComplexDiscreteSignal<T> s2)- 通过叠加信号 s1 和 s2 创建新信号。如果大小不同,则较小的信号将广播以适应较大的信号大小。
- 参数:
-
s1: 第一个信号。 -
s2: 第二个信号。
-
- 返回值: 叠加后的新信号。
-
public static ComplexDiscreteSignal<T> operator +(ComplexDiscreteSignal<T> s, T constant)- 通过将常数添加到信号 s 创建新信号。
- 参数:
-
s: 信号。 -
constant: 要添加到每个样本的常数。
-
- 返回值: 添加常数后的新信号。
-
public static ComplexDiscreteSignal<T> operator -(ComplexDiscreteSignal<T> s, T constant)- 通过从信号 s 中减去常数创建新信号。
- 参数:
-
s: 信号。 -
constant: 要从每个样本中减去的常数。
-
- 返回值: 减去常数后的新信号。
-
public static ComplexDiscreteSignal<T> operator *(ComplexDiscreteSignal<T> s, T coeff)- 通过将信号 s 乘以系数(放大/衰减)创建新信号。
- 参数:
-
s: 信号。 -
coeff: 放大/衰减系数。
-
- 返回值: 乘以系数后的新信号。
以下是一个使用 ComplexDiscreteSignal 类中多个方法的示例,并在示例中加入了注释:
using System;
using Vorcyc.Mathematics.SignalProcessing.Signals;
public class ComplexDiscreteSignalExample
{
public static void Main()
{
// 定义采样率
int samplingRate = 44100;
// 定义实部和虚部数组
float[] real = { 0.5f, 0.6f, 0.55f };
float[] imag = { 0.1f, 0.2f, 0.15f };
// 创建 ComplexDiscreteSignalFp32 实例
var signal = new ComplexDiscreteSignal<float>(samplingRate, real, imag);
// 输出信号的实部和虚部
Console.WriteLine("Real Parts:");
foreach (var r in signal.Real)
{
Console.WriteLine(r);
}
Console.WriteLine("Imaginary Parts:");
foreach (var i in signal.Imag)
{
Console.WriteLine(i);
}
// 获取并输出信号的幅度
var magnitude = signal.Magnitude;
Console.WriteLine("Magnitude:");
foreach (var m in magnitude)
{
Console.WriteLine(m);
}
// 获取并输出信号的相位
var phase = signal.Phase;
Console.WriteLine("Phase:");
foreach (var p in phase)
{
Console.WriteLine(p);
}
// 创建信号的切片
var slicedSignal = signal[1, 3];
Console.WriteLine("Sliced Signal Real Parts:");
foreach (var r in slicedSignal.Real)
{
Console.WriteLine(r);
}
// 创建信号的深拷贝
var copiedSignal = signal.Copy();
Console.WriteLine("Copied Signal Real Parts:");
foreach (var r in copiedSignal.Real)
{
Console.WriteLine(r);
}
}
}Vorcyc.Mathematics.SignalProcessing.Signals.DiscreteSignal 是一个用于表示有限实数值离散时间信号的类。信号以一定的采样率存储为一个数据数组。
-
public int SamplingRate { get; }- 获取采样率(每秒的样本数)。
-
public int SampleCount { get; }- 获取样本量,分配后不变。
-
public int ValidSampleCount { get; }- 获取有效样本量。
-
public TimeSpan Duration { get; }- 获取信号的持续时间。
-
public PinnableArray<float> Samples { get; }- 获取信号的样本数组。
-
public MemoryStrategy MemoryStrategy { get; }- 获取信号的内存策略。
-
public DiscreteSignal(int samplingRate, TimeSpan duration, MemoryStrategy strategy = MemoryStrategy.Immediate)- 使用采样率和持续时间构造 DiscreteSignal 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
duration: 信号的持续时间。 -
strategy: 内存策略,默认为MemoryStrategy.Immediate。
-
-
public DiscreteSignal(int samplingRate, int count, MemoryStrategy strategy = MemoryStrategy.Immediate)- 使用采样率和样本数量构造 DiscreteSignal 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
count: 样本数量。 -
strategy: 内存策略,默认为MemoryStrategy.Immediate。
-
-
public DiscreteSignal(int samplingRate, float[] samples, MemoryStrategy strategy = MemoryStrategy.Immediate)- 使用采样率和样本数组构造 DiscreteSignal 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
samples: 样本数组。 -
strategy: 内存策略,默认为MemoryStrategy.Immediate。
-
-
public DiscreteSignal(int samplingRate, float[] samples, int offset, int count, MemoryStrategy strategy = MemoryStrategy.Immediate)- 使用采样率、样本数组、偏移量和样本数量构造 DiscreteSignal 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
samples: 样本数组。 -
offset: 样本数组的偏移量。 -
count: 样本数量。 -
strategy: 内存策略,默认为MemoryStrategy.Immediate。
-
-
public DiscreteSignal(int samplingRate, IEnumerable<float> samples, MemoryStrategy strategy = MemoryStrategy.Immediate)- 使用采样率和样本集合构造 DiscreteSignal 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
samples: 样本集合。 -
strategy: 内存策略,默认为MemoryStrategy.Immediate。
-
-
public DiscreteSignal(int samplingRate, ArraySegment<float> segment, MemoryStrategy strategy = MemoryStrategy.Immediate)- 使用采样率和样本段构造 DiscreteSignal 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
segment: 样本段。 -
strategy: 内存策略,默认为MemoryStrategy.Immediate。
-
-
public DiscreteSignal(int samplingRate, Span<float> span, MemoryStrategy strategy = MemoryStrategy.Immediate)- 使用采样率和样本跨度构造 DiscreteSignal 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
span: 样本跨度。 -
strategy: 内存策略,默认为MemoryStrategy.Immediate。
-
-
public DiscreteSignal Clone()- 创建信号的深拷贝。
- 返回值: 信号的深拷贝。
-
public float this[int index] { get; set; }- 样本索引器。
- 参数:
-
index: 样本索引。
-
- 返回值: 样本值。
-
public DiscreteSignal this[int startPos, int endPos] { get; }- 创建信号的切片。
- 参数:
-
startPos: 第一个样本的索引(包含)。 -
endPos: 最后一个样本的索引(不包含)。
-
- 返回值: 信号的切片。
-
public DiscreteSignal this[Range range] { get; }- 创建信号的切片。
- 参数:
-
range: 样本范围。
-
- 返回值: 信号的切片。
-
public float Energy(int startPos, int endPos)- 计算信号片段的能量。
- 参数:
-
startPos: 第一个样本的索引(包含)。 -
endPos: 最后一个样本的索引(不包含)。
-
- 返回值: 信号片段的能量。
-
public float Energy(Range range)- 计算信号片段的能量。
- 参数:
-
range: 样本范围。
-
- 返回值: 信号片段的能量。
-
public float Energy()- 计算整个信号的能量。
- 返回值: 整个信号的能量。
-
public float Rms(int startPos, int endPos)- 计算信号片段的均方根值。
- 参数:
-
startPos: 第一个样本的索引(包含)。 -
endPos: 最后一个样本的索引(不包含)。
-
- 返回值: 信号片段的均方根值。
-
public float Rms(Range range)- 计算信号片段的均方根值。
- 参数:
-
range: 样本范围。
-
- 返回值: 信号片段的均方根值。
-
public float Rms()- 计算整个信号的均方根值。
- 返回值: 整个信号的均方根值。
-
public float ZeroCrossingRate(int startPos, int endPos)- 计算信号片段的过零率。
- 参数:
-
startPos: 第一个样本的索引(包含)。 -
endPos: 最后一个样本的索引(不包含)。
-
- 返回值: 信号片段的过零率。
-
public float ZeroCrossingRate(Range range)- 计算信号片段的过零率。
- 参数:
-
range: 样本范围。
-
- 返回值: 信号片段的过零率。
-
public float ZeroCrossingRate()- 计算整个信号的过零率。
- 返回值: 整个信号的过零率。
-
public float Entropy(int startPos, int endPos, int binCount = 32)- 计算信号片段的香农熵。
- 参数:
-
startPos: 第一个样本的索引(包含)。 -
endPos: 最后一个样本的索引(不包含)。 -
binCount: 直方图的箱数,默认为 32。
-
- 返回值: 信号片段的香农熵。
-
public float Entropy(Range range, int binCount = 32)- 计算信号片段的香农熵。
- 参数:
-
range: 样本范围。 -
binCount: 直方图的箱数,默认为 32。
-
- 返回值: 信号片段的香农熵。
-
public float Entropy(int binCount = 32)- 计算整个信号的香农熵。
- 参数:
-
binCount: 直方图的箱数,默认为 32。
-
- 返回值: 整个信号的香农熵。
-
public static DiscreteSignal operator +(DiscreteSignal s1, DiscreteSignal s2)- 通过叠加信号 s1 和 s2 创建新信号。如果大小不同,则较小的信号将广播以适应较大的信号大小。
- 参数:
-
s1: 第一个信号。 -
s2: 第二个信号。
-
- 返回值: 叠加后的新信号。
-
public static DiscreteSignal operator +(DiscreteSignal s, float constant)- 通过将常数添加到信号 s 创建新信号。
- 参数:
-
s: 信号。 -
constant: 要添加到每个样本的常数。
-
- 返回值: 添加常数后的新信号。
-
public static DiscreteSignal operator -(DiscreteSignal s)- 创建信号 s 的取反副本。
- 参数:
-
s: 信号。
-
- 返回值: 取反后的新信号。
-
public static DiscreteSignal operator -(DiscreteSignal s1, DiscreteSignal s2)- 通过从信号 s1 中减去信号 s2 创建新信号。如果大小不同,则较小的信号将广播以适应较大的信号大小。
- 参数:
-
s1: 第一个信号。 -
s2: 第二个信号。
-
- 返回值: 减去后的新信号。
-
public static DiscreteSignal operator -(DiscreteSignal s, float constant)- 通过从信号 s 中减去常数创建新信号。
- 参数:
-
s: 信号。 -
constant: 要从每个样本中减去的常数。
-
- 返回值: 减去常数后的新信号。
-
public static DiscreteSignal operator *(DiscreteSignal s, float coeff)- 通过将信号 s 乘以系数(放大/衰减)创建新信号。
- 参数:
-
s: 信号。 -
coeff: 放大/衰减系数。
-
- 返回值: 乘以系数后的新信号。
以下是一个使用 DiscreteSignal 类中多个方法的示例,并在示例中加入了注释:
using System;
using Vorcyc.Mathematics.SignalProcessing.Signals;
public class DiscreteSignalExample
{
public static void Main()
{
// 定义采样率
int samplingRate = 44100;
// 定义样本数组
float[] samples = { 0.5f, 0.6f, 0.55f };
// 创建 DiscreteSignal 实例
var signal = new DiscreteSignal(samplingRate, samples);
// 输出信号的样本
Console.WriteLine("Samples:");
foreach (var sample in signal.Samples)
{
Console.WriteLine(sample);
}
// 获取并输出信号的能量
var energy = signal.Energy();
Console.WriteLine("Energy:");
Console.WriteLine(energy);
// 获取并输出信号的均方根值
var rms = signal.Rms();
Console.WriteLine("RMS:");
Console.WriteLine(rms);
// 获取并输出信号的过零率
var zeroCrossingRate = signal.ZeroCrossingRate();
Console.WriteLine("Zero Crossing Rate:");
Console.WriteLine(zeroCrossingRate);
// 获取并输出信号的香农熵
var entropy = signal.Entropy();
Console.WriteLine("Entropy:");
Console.WriteLine(entropy);
// 创建信号的切片
var slicedSignal = signal[1, 3];
Console.WriteLine("Sliced Signal Samples:");
foreach (var sample in slicedSignal.Samples)
{
Console.WriteLine(sample);
}
// 创建信号的深拷贝
var copiedSignal = signal.Clone();
Console.WriteLine("Copied Signal Samples:");
foreach (var sample in copiedSignal.Samples)
{
Console.WriteLine(sample);
}
}
}Vorcyc.Mathematics.SignalProcessing.Signals.DiscreteSignal<TSample> 是一个用于表示有限实数值离散时间信号的类。信号以一定的采样率存储为一个数据数组。
-
public int SamplingRate { get; }- 获取采样率(每秒的样本数)。
-
public int SampleCount { get; }- 获取样本量,分配后不变。
-
public int ValidSampleCount { get; }- 获取有效样本量。
-
public TimeSpan Duration { get; }- 获取信号的持续时间。
-
public PinnableArray<TSample> Samples { get; }- 获取信号的样本数组。
-
public MemoryStrategy MemoryStrategy { get; }- 获取信号的内存策略。
-
public DiscreteSignal(int samplingRate, TimeSpan duration, MemoryStrategy strategy = MemoryStrategy.Immediate)- 使用采样率和持续时间构造 DiscreteSignal 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
duration: 信号的持续时间。 -
strategy: 内存策略,默认为MemoryStrategy.Immediate。
-
-
public DiscreteSignal(int samplingRate, int count, MemoryStrategy strategy = MemoryStrategy.Immediate)- 使用采样率和样本数量构造 DiscreteSignal 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
count: 样本数量。 -
strategy: 内存策略,默认为MemoryStrategy.Immediate。
-
-
public DiscreteSignal(int samplingRate, TSample[] samples, MemoryStrategy strategy = MemoryStrategy.Immediate)- 使用采样率和样本数组构造 DiscreteSignal 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
samples: 样本数组。 -
strategy: 内存策略,默认为MemoryStrategy.Immediate。
-
-
public DiscreteSignal(int samplingRate, TSample[] samples, int offset, int count, MemoryStrategy strategy = MemoryStrategy.Immediate)- 使用采样率、样本数组、偏移量和样本数量构造 DiscreteSignal 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
samples: 样本数组。 -
offset: 样本数组的偏移量。 -
count: 样本数量。 -
strategy: 内存策略,默认为MemoryStrategy.Immediate。
-
-
public DiscreteSignal(int samplingRate, IEnumerable<TSample> samples, MemoryStrategy strategy = MemoryStrategy.Immediate)- 使用采样率和样本集合构造 DiscreteSignal 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
samples: 样本集合。 -
strategy: 内存策略,默认为MemoryStrategy.Immediate。
-
-
public DiscreteSignal(int samplingRate, ArraySegment<TSample> segment, MemoryStrategy strategy = MemoryStrategy.Immediate)- 使用采样率和样本段构造 DiscreteSignal 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
segment: 样本段。 -
strategy: 内存策略,默认为MemoryStrategy.Immediate。
-
-
public DiscreteSignal(int samplingRate, Span<TSample> span, MemoryStrategy strategy = MemoryStrategy.Immediate)- 使用采样率和样本跨度构造 DiscreteSignal 实例。
- 参数:
-
samplingRate: 信号的采样率。 -
span: 样本跨度。 -
strategy: 内存策略,默认为MemoryStrategy.Immediate。
-
-
public DiscreteSignal<TSample> Clone()- 创建信号的深拷贝。
- 返回值: 信号的深拷贝。
-
public TSample this[int index] { get; set; }- 样本索引器。
- 参数:
-
index: 样本索引。
-
- 返回值: 样本值。
-
public DiscreteSignal<TSample> this[int startPos, int endPos] { get; }- 创建信号的切片。
- 参数:
-
startPos: 第一个样本的索引(包含)。 -
endPos: 最后一个样本的索引(不包含)。
-
- 返回值: 信号的切片。
-
public DiscreteSignal<TSample> this[Range range] { get; }- 创建信号的切片。
- 参数:
-
range: 样本范围。
-
- 返回值: 信号的切片。
-
public TSample Energy(int startPos, int endPos)- 计算信号片段的能量。
- 参数:
-
startPos: 第一个样本的索引(包含)。 -
endPos: 最后一个样本的索引(不包含)。
-
- 返回值: 信号片段的能量。
-
public TSample Energy(Range range)- 计算信号片段的能量。
- 参数:
-
range: 样本范围。
-
- 返回值: 信号片段的能量。
-
public TSample Energy()- 计算整个信号的能量。
- 返回值: 整个信号的能量。
-
public TSample Rms(int startPos, int endPos)- 计算信号片段的均方根值。
- 参数:
-
startPos: 第一个样本的索引(包含)。 -
endPos: 最后一个样本的索引(不包含)。
-
- 返回值: 信号片段的均方根值。
-
public TSample Rms(Range range)- 计算信号片段的均方根值。
- 参数:
-
range: 样本范围。
-
- 返回值: 信号片段的均方根值。
-
public TSample Rms()- 计算整个信号的均方根值。
- 返回值: 整个信号的均方根值。
-
public TSample ZeroCrossingRate(int startPos, int endPos)- 计算信号片段的过零率。
- 参数:
-
startPos: 第一个样本的索引(包含)。 -
endPos: 最后一个样本的索引(不包含)。
-
- 返回值: 信号片段的过零率。
-
public TSample ZeroCrossingRate(Range range)- 计算信号片段的过零率。
- 参数:
-
range: 样本范围。
-
- 返回值: 信号片段的过零率。
-
public TSample ZeroCrossingRate()- 计算整个信号的过零率。
- 返回值: 整个信号的过零率。
-
public TSample Entropy(int startPos, int endPos, int binCount = 32)- 计算信号片段的香农熵。
- 参数:
-
startPos: 第一个样本的索引(包含)。 -
endPos: 最后一个样本的索引(不包含)。 -
binCount: 直方图的箱数,默认为 32。
-
- 返回值: 信号片段的香农熵。
-
public TSample Entropy(Range range, int binCount = 32)- 计算信号片段的香农熵。
- 参数:
-
range: 样本范围。 -
binCount: 直方图的箱数,默认为 32。
-
- 返回值: 信号片段的香农熵。
-
public TSample Entropy(int binCount = 32)- 计算整个信号的香农熵。
- 参数:
-
binCount: 直方图的箱数,默认为 32。
-
- 返回值: 整个信号的香农熵。
-
public static DiscreteSignal<TSample> operator +(DiscreteSignal<TSample> s1, DiscreteSignal<TSample> s2)- 通过叠加信号 s1 和 s2 创建新信号。如果大小不同,则较小的信号将广播以适应较大的信号大小。
- 参数:
-
s1: 第一个信号。 -
s2: 第二个信号。
-
- 返回值: 叠加后的新信号。
-
public static DiscreteSignal<TSample> operator +(DiscreteSignal<TSample> s, TSample constant)- 通过将常数添加到信号 s 创建新信号。
- 参数:
-
s: 信号。 -
constant: 要添加到每个样本的常数。
-
- 返回值: 添加常数后的新信号。
-
public static DiscreteSignal<TSample> operator -(DiscreteSignal<TSample> s)- 创建信号 s 的取反副本。
- 参数:
-
s: 信号。
-
- 返回值: 取反后的新信号。
-
public static DiscreteSignal<TSample> operator -(DiscreteSignal<TSample> s1, DiscreteSignal<TSample> s2)- 通过从信号 s1 中减去信号 s2 创建新信号。如果大小不同,则较小的信号将广播以适应较大的信号大小。
- 参数:
-
s1: 第一个信号。 -
s2: 第二个信号。
-
- 返回值: 减去后的新信号。
-
public static DiscreteSignal<TSample> operator -(DiscreteSignal<TSample> s, TSample constant)- 通过从信号 s 中减去常数创建新信号。
- 参数:
-
s: 信号。 -
constant: 要从每个样本中减去的常数。
-
- 返回值: 减去常数后的新信号。
-
public static DiscreteSignal<TSample> operator *(DiscreteSignal<TSample> s, TSample coeff)- 通过将信号 s 乘以系数(放大/衰减)创建新信号。
- 参数:
-
s: 信号。 -
coeff: 放大/衰减系数。
-
- 返回值: 乘以系数后的新信号。
以下是一个使用 DiscreteSignal 类中多个方法的示例,并在示例中加入了注释:
using System;
using Vorcyc.Mathematics.SignalProcessing.Signals;
public class DiscreteSignalExample
{
public static void Main()
{
// 定义采样率
int samplingRate = 44100;
// 定义样本数组
float[] samples = { 0.5f, 0.6f, 0.55f };
// 创建 DiscreteSignal 实例
var signal = new DiscreteSignal<float>(samplingRate, samples);
// 输出信号的样本
Console.WriteLine("Samples:");
foreach (var sample in signal.Samples)
{
Console.WriteLine(sample);
}
// 获取并输出信号的能量
var energy = signal.Energy();
Console.WriteLine("Energy:");
Console.WriteLine(energy);
// 获取并输出信号的均方根值
var rms = signal.Rms();
Console.WriteLine("RMS:");
Console.WriteLine(rms);
// 获取并输出信号的过零率
var zeroCrossingRate = signal.ZeroCrossingRate();
Console.WriteLine("Zero Crossing Rate:");
Console.WriteLine(zeroCrossingRate);
// 获取并输出信号的香农熵
var entropy = signal.Entropy();
Console.WriteLine("Entropy:");
Console.WriteLine(entropy);
// 创建信号的切片
var slicedSignal = signal[1, 3];
Console.WriteLine("Sliced Signal Samples:");
foreach (var sample in slicedSignal.Samples)
{
Console.WriteLine(sample);
}
// 创建信号的深拷贝
var copiedSignal = signal.Clone();
Console.WriteLine("Copied Signal Samples:");
foreach (var sample in copiedSignal.Samples)
{
Console.WriteLine(sample);
}
}
}Vorcyc.Mathematics.SignalProcessing.Signals.DiscreteSignalExtensions 提供了用于处理离散信号的扩展方法。
-
public static DiscreteSignal Delay(this DiscreteSignal signal, int delay)- 创建
signal的延迟副本,通过将其向右(正delay)或向左(负delay)移动。 - 参数:
-
signal: 信号。 -
delay: 延迟(正数或负数的延迟样本数)。
-
- 返回值: 延迟后的
DiscreteSignal。
- 创建
-
public static DiscreteSignal Superimpose(this DiscreteSignal signal1, DiscreteSignal signal2)- 叠加
signal1和signal2。如果大小不同,则较小的信号将广播以适应较大的信号大小。 - 参数:
-
signal1: 第一个信号。 -
signal2: 第二个信号。
-
- 返回值: 叠加后的
DiscreteSignal。
- 叠加
-
public static DiscreteSignal SuperimposeMany(this DiscreteSignal signal1, DiscreteSignal signal2, int[] positions)- 在给定的
positions位置处多次叠加signal2和signal1。 - 参数:
-
signal1: 第一个信号。 -
signal2: 第二个信号。 -
positions: 插入signal2的位置(索引)。
-
- 返回值: 叠加后的
DiscreteSignal。
- 在给定的
-
public static DiscreteSignal Subtract(this DiscreteSignal signal1, DiscreteSignal signal2)- 从
signal1中减去signal2。如果大小不同,则较小的信号将广播以适应较大的信号大小。 - 参数:
-
signal1: 第一个信号。 -
signal2: 第二个信号。
-
- 返回值: 减去后的
DiscreteSignal。
- 从
-
public static DiscreteSignal Concatenate(this DiscreteSignal signal1, DiscreteSignal signal2)- 连接
signal1和signal2。 - 参数:
-
signal1: 第一个信号。 -
signal2: 第二个信号。
-
- 返回值: 连接后的
DiscreteSignal。
- 连接
-
public static DiscreteSignal Repeat(this DiscreteSignal signal, int n)- 创建
signal的副本,并重复n次。 - 参数:
-
signal: 信号。 -
n: 重复次数。
-
- 返回值: 重复后的
DiscreteSignal。
- 创建
-
public static void Amplify(this DiscreteSignal signal, float coeff)- 按
coeff放大signal。 - 参数:
-
signal: 信号。 -
coeff: 放大系数。
-
- 按
-
public static void Attenuate(this DiscreteSignal signal, float coeff)- 按
coeff衰减signal。 - 参数:
-
signal: 信号。 -
coeff: 衰减系数。
-
- 按
-
public static void Reverse(this DiscreteSignal signal)- 反转
signal。 - 参数:
-
signal: 信号。
-
- 反转
-
public static DiscreteSignal First(this DiscreteSignal signal, int n)- 从
signal的前n个样本创建新信号。 - 参数:
-
signal: 信号。 -
n: 样本数。
-
- 返回值: 新的
DiscreteSignal。
- 从
-
public static DiscreteSignal Last(this DiscreteSignal signal, int n)- 从
signal的后n个样本创建新信号。 - 参数:
-
signal: 信号。 -
n: 样本数。
-
- 返回值: 新的
DiscreteSignal。
- 从
-
public static void FullRectify(this DiscreteSignal signal)- 全波整流
signal。 - 参数:
-
signal: 信号。
-
- 全波整流
-
public static void HalfRectify(this DiscreteSignal signal)- 半波整流
signal。 - 参数:
-
signal: 信号。
-
- 半波整流
-
public static void NormalizeMax(this DiscreteSignal signal, int bitsPerSample = 0)- 按最大绝对值归一化
signal(范围 [-1, 1])。 - 参数:
-
signal: 信号。 -
bitsPerSample: 采样位深,默认为 0。
-
- 按最大绝对值归一化
-
public static ComplexDiscreteSignalFp32 ToComplex(this DiscreteSignal signal)- 从
DiscreteSignal创建ComplexDiscreteSignalFp32,虚部将填充为零。 - 参数:
-
signal: 实值信号。
-
- 返回值: 复数值信号
ComplexDiscreteSignalFp32。
- 从
-
public static void FadeInFadeOut(this DiscreteSignal signal, double fadeInDuration, double fadeOutDuration)- 对
signal进行线性淡入淡出。 - 参数:
-
signal: 信号。 -
fadeInDuration: 淡入持续时间(秒)。 -
fadeOutDuration: 淡出持续时间(秒)。
-
- 对
-
public static void FadeInFadeOut(this DiscreteSignal signal, TimeSpan fadeInDuration, TimeSpan fadeOutDuration)- 对
signal进行线性淡入淡出。 - 参数:
-
signal: 信号。 -
fadeInDuration: 淡入持续时间。 -
fadeOutDuration: 淡出持续时间。
-
- 对
-
public static void FadeIn(this DiscreteSignal signal, double duration)- 对
signal进行线性淡入。 - 参数:
-
signal: 信号。 -
duration: 淡入持续时间(秒)。
-
- 对
-
public static void FadeIn(this DiscreteSignal signal, TimeSpan duration)- 对
signal进行线性淡入。 - 参数:
-
signal: 信号。 -
duration: 淡入持续时间。
-
- 对
-
public static void FadeOut(this DiscreteSignal signal, double duration)- 对
signal进行线性淡出。 - 参数:
-
signal: 信号。 -
duration: 淡出持续时间(秒)。
-
- 对
-
public static void FadeOut(this DiscreteSignal signal, TimeSpan duration)- 对
signal进行线性淡出。 - 参数:
-
signal: 信号。 -
duration: 淡出持续时间。
-
- 对
-
public static DiscreteSignal Crossfade(this DiscreteSignal signal1, DiscreteSignal signal2, double duration)- 在
signal1和signal2之间进行线性交叉淡化,并返回交叉淡化后的信号,长度等于信号长度之和减去交叉淡化部分的长度。 - 参数:
-
signal1: 第一个信号。 -
signal2: 第二个信号。 -
duration: 交叉淡化持续时间(秒)。
-
- 返回值: 交叉淡化后的
DiscreteSignal。
- 在
-
public static DiscreteSignal Crossfade(this DiscreteSignal signal1, DiscreteSignal signal2, TimeSpan duration)- 在
signal1和signal2之间进行线性交叉淡化,并返回交叉淡化后的信号,长度等于信号长度之和减去交叉淡化部分的长度。 - 参数:
-
signal1: 第一个信号。 -
signal2: 第二个信号。 -
duration: 交叉淡化持续时间。
-
- 返回值: 交叉淡化后的
DiscreteSignal。
- 在
以下是一个使用 DiscreteSignalExtensions 类中多个方法的示例,并在示例中加入了注释:
using System;
using Vorcyc.Mathematics.SignalProcessing.Signals;
public class DiscreteSignalExtensionsExample
{
public static void Main()
{
// 定义采样率
int samplingRate = 44100;
// 定义样本数组
float[] samples = { 0.5f, 0.6f, 0.55f };
// 创建 DiscreteSignal 实例
var signal = new DiscreteSignal(samplingRate, samples);
// 创建延迟信号
var delayedSignal = signal.Delay(2);
Console.WriteLine("Delayed Signal Samples:");
foreach (var sample in delayedSignal.Samples)
{
Console.WriteLine(sample);
}
// 叠加信号
var superimposedSignal = signal.Superimpose(delayedSignal);
Console.WriteLine("Superimposed Signal Samples:");
foreach (var sample in superimposedSignal.Samples)
{
Console.WriteLine(sample);
}
// 连接信号
var concatenatedSignal = signal.Concatenate(delayedSignal);
Console.WriteLine("Concatenated Signal Samples:");
foreach (var sample in concatenatedSignal.Samples)
{
Console.WriteLine(sample);
}
// 放大信号
signal.Amplify(2.0f);
Console.WriteLine("Amplified Signal Samples:");
foreach (var sample in signal.Samples)
{
Console.WriteLine(sample);
}
// 衰减信号
signal.Attenuate(2.0f);
Console.WriteLine("Attenuated Signal Samples:");
foreach (var sample in signal.Samples)
{
Console.WriteLine(sample);
}
// 获取前 n 个样本
var firstSamples = signal.First(2);
Console.WriteLine("First Samples:");
foreach (var sample in firstSamples.Samples)
{
Console.WriteLine(sample);
}
// 获取后 n 个样本
var lastSamples = signal.Last(2);
Console.WriteLine("Last Samples:");
foreach (var sample in lastSamples.Samples)
{
Console.WriteLine(sample);
}
// 全波整流信号
signal.FullRectify();
Console.WriteLine("Full Rectified Signal Samples:");
foreach (var sample in signal.Samples)
{
Console.WriteLine(sample);
}
// 半波整流信号
signal.HalfRectify();
Console.WriteLine("Half Rectified Signal Samples:");
foreach (var sample in signal.Samples)
{
Console.WriteLine(sample);
}
// 归一化信号
signal.NormalizeMax();
Console.WriteLine("Normalized Signal Samples:");
foreach (var sample in signal.Samples)
{
Console.WriteLine(sample);
}
// 淡入淡出信号
signal.FadeInFadeOut(0.1, 0.1);
Console.WriteLine("Fade In Fade Out Signal Samples:");
foreach (var sample in signal.Samples)
{
Console.WriteLine(sample);
}
// 交叉淡化信号
var crossfadedSignal = signal.Crossfade(delayedSignal, 0.1);
Console.WriteLine("Crossfaded Signal Samples:");
foreach (var sample in crossfadedSignal.Samples)
{
Console.WriteLine(sample);
}
}
}-
- 🔖 ArrayExtension class
- 🔖 BaseConverter class
- 🔖 BitMathExtension class
- 🔖 Combinatorics class
- 🔖 ConstantsFp32 class
- 🔖 NumberMapper class
- 🔖 PinnableArray<T> class
- 🔖 SimpleRNG_Fp32 and SimpleRNG_Fp64 classes
- 🔖 TrigonometryHelper class
- 🔖 VMath class
- 🔖 Pinned buffers (Buffers)
- 🔖 IPinnedBuffer<T> interface
- 🔖 POHBuffer<T> class
- 🔖 NativeBuffer<T> class
-
- 🔖 0.9 classifier walkthrough
- 🔖 KNN<T> class
- 🔖 MultipleLinearRegression<T> class
- 🔖 SimpleLinearRegression<T> class
- 🔖 SupportVectorMachine<TSelf> class
- 🔖 DBSCAN<T> class
- 🔖 ExpectationMaximization<T> class
- 🔖 GMM<T> class
- 🔖 HierarchicalClustering<T> class
- 🔖 KMeansClusterer<T> class
- 🔖 VectorQuantization<T> class
- 🔖 FactorAnalysis<T> class
- 🔖 PCA<TSelf> class
- 🔖 TSNE<T> class
- 🔖 Distance metric classes
-
📒 Examples
-
📒 GPU 策略说明
- 🔖 为何放弃主包 GPU
- 🔖 当前性能路径
- 🔖 若仍需要更强算力
-
📒 计算上下文模块
-
📒 核心模块
-
📒 深度学习模块
-
📒 线性代数模块
-
📒 机器学习模块
- 🔖 0.9 分类器完整示例
- 🔖 KNN<T> 类
- 🔖 MultipleLinearRegression<T> 类
- 🔖 SimpleLinearRegression<T> 类
- 🔖 SupportVectorMachine<TSelf> 类
- 🔖 DBSCAN<T> 类
- 🔖 ExpectationMaximization<T> 类
- 🔖 GMM<T> 类
- 🔖 HierarchicalClustering<T> 类
- 🔖 KMeansClusterer<T> 类
- 🔖 VectorQuantization<T> 类
- 🔖 FactorAnalysis<T> 类
- 🔖 PCA<TSelf> 类
- 🔖 TSNE<T> 类
- 🔖 距离度量类
-
📒 信号处理模块
-
📒 数值模块
-
📒 统计模块
- 🔖 基础统计函数
- 🔖 高级统计函数
- 🔖 稳健统计 / RunningMoments
- 🔖 其它统计函数
- 🔖 分布相关函数
- 🔖 时间序列分析
- 🔖 IComparable 扩展
- 🔖 ExtremeValueFinder
- 🔖 INumber 扩展
-
📒 FFTW 扩展
-
📒 示例