Skip to content

Module_SignalProcessing_Signals_zh

cyclone_dll edited this page Oct 1, 2026 · 12 revisions

当前位置 : 首页/信号处理模块/信号定义和相关操作

信号处理模块 - Signal Processing Module

信号定义和相关操作 - Signals

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 类 为准。

Generators(生成器,0.9+)

命名空间: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);

WaveShape / GenerateWave

对已有 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


📒目录


Vorcyc.Mathematics.SignalProcessing.Signals.Signal 类

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/并行划算时走 SoA FftButterflyFp32)
  • FrequencyDomain.IndexToFrequency:0.10.15 起按 TransformLength(FFT 长度)映射;onesided 幅值 bin 0…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);

Vorcyc.Mathematics.SignalProcessing.Signals.SignalSegment 结构

只读结构体,表示父 Signal 上连续样本的零拷贝视图。实现 ITimeDomainSignal / ISingleThreadTimeDomainSignal,帧级 Rms、AverageEnergy、ZeroCrossingRate、Entropy 等通过 SIMD 延迟计算。

  • 由 signal[start, length] 或 signal[range] 获得
  • Samples 为指向父缓冲子区间的 Span<float>
  • 可独立调用 TransformToFrequencyDomain、Resample

Vorcyc.Mathematics.SignalProcessing.Signals.SignalExtensions 类

自 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 类

Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignalFp32 是一个用于表示有限复数值离散时间信号的类。信号以一定的采样率存储为两个数据数组(实部和虚部)。

属性

1. SamplingRate

  • public int SamplingRate { get; }
    • 获取采样率(每秒的样本数)。

2. Real

  • public float[] Real { get; }
    • 获取复数值样本的实部。

3. Imag

  • public float[] Imag { get; }
    • 获取复数值样本的虚部。

4. Length

  • public int Length => Real.Length
    • 获取信号的长度。

5. Magnitude

  • public float[] Magnitude
    • 获取复数值样本的幅度。

6. Power

  • public float[] Power
    • 获取复数值样本的功率(幅度的平方)。

7. Phase

  • public float[] Phase
    • 获取复数值样本的相位。

8. PhaseUnwrapped

  • public float[] PhaseUnwrapped
    • 获取复数值样本的展开相位。

方法

1. ComplexDiscreteSignalFp32 构造函数

  • 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。

2. Copy

  • public ComplexDiscreteSignalFp32 Copy()
    • 创建信号的深拷贝。
    • 返回值: 信号的深拷贝。

3. 索引器

  • public float this[int index] { get; set; }

    • 样本索引器。仅适用于样本实部数组。谨慎使用。
    • 参数:
      • index: 样本索引。
    • 返回值: 样本的实部值。
  • public ComplexDiscreteSignalFp32 this[int startPos, int endPos] { get; }

    • 创建信号的切片。
    • 参数:
      • startPos: 第一个样本的索引(包含)。
      • endPos: 最后一个样本的索引(不包含)。
    • 返回值: 信号的切片。

重载运算符

1. operator +

  • public static ComplexDiscreteSignalFp32 operator +(ComplexDiscreteSignalFp32 s1, ComplexDiscreteSignalFp32 s2)

    • 通过叠加信号 s1 和 s2 创建新信号。如果大小不同,则较小的信号将广播以适应较大的信号大小。
    • 参数:
      • s1: 第一个信号。
      • s2: 第二个信号。
    • 返回值: 叠加后的新信号。
  • public static ComplexDiscreteSignalFp32 operator +(ComplexDiscreteSignalFp32 s, float constant)

    • 通过将常数添加到信号 s 创建新信号。
    • 参数:
      • s: 信号。
      • constant: 要添加到每个样本的常数。
    • 返回值: 添加常数后的新信号。

2. operator -

  • public static ComplexDiscreteSignalFp32 operator -(ComplexDiscreteSignalFp32 s, float constant)
    • 通过从信号 s 中减去常数创建新信号。
    • 参数:
      • s: 信号。
      • constant: 要从每个样本中减去的常数。
    • 返回值: 减去常数后的新信号。

3. operator *

  • 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.ComplexDiscreteSignalFp32<T> 类

Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignal<T> 是一个用于表示有限复数值离散时间信号的类。信号以一定的采样率存储为两个数据数组(实部和虚部)。

属性

1. SamplingRate

  • public int SamplingRate { get; }
    • 获取采样率(每秒的样本数)。

2. Real

  • public T[] Real { get; }
    • 获取复数值样本的实部。

3. Imag

  • public T[] Imag { get; }
    • 获取复数值样本的虚部。

4. Length

  • public int Length => Real.Length
    • 获取信号的长度。

5. Magnitude

  • public T[] Magnitude
    • 获取复数值样本的幅度。

6. Power

  • public T[] Power
    • 获取复数值样本的功率(幅度的平方)。

7. Phase

  • public T[] Phase
    • 获取复数值样本的相位。

8. PhaseUnwrapped

  • public T[] PhaseUnwrapped
    • 获取复数值样本的展开相位。

方法

1. ComplexDiscreteSignalFp32 构造函数

  • 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。

2. Copy

  • public ComplexDiscreteSignal<T> Copy()
    • 创建信号的深拷贝。
    • 返回值: 信号的深拷贝。

3. 索引器

  • public T this[int index] { get; set; }

    • 样本索引器。仅适用于样本实部数组。谨慎使用。
    • 参数:
      • index: 样本索引。
    • 返回值: 样本的实部值。
  • public ComplexDiscreteSignal<T> this[int startPos, int endPos] { get; }

    • 创建信号的切片。
    • 参数:
      • startPos: 第一个样本的索引(包含)。
      • endPos: 最后一个样本的索引(不包含)。
    • 返回值: 信号的切片。

重载运算符

1. operator +

  • 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: 要添加到每个样本的常数。
    • 返回值: 添加常数后的新信号。

2. operator -

  • public static ComplexDiscreteSignal<T> operator -(ComplexDiscreteSignal<T> s, T constant)
    • 通过从信号 s 中减去常数创建新信号。
    • 参数:
      • s: 信号。
      • constant: 要从每个样本中减去的常数。
    • 返回值: 减去常数后的新信号。

3. operator *

  • 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 类

Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignalExtensions 提供了用于处理复数离散信号的扩展方法。

方法

1. Delay

  • 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>。

2. Superimpose

  • 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>。

3. Concatenate

  • 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>。

4. Repeat

  • 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>。

5. Amplify

  • 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: 放大系数。

6. Attenuate

  • 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: 衰减系数。

7. First

  • 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>。

8. Last

  • 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>。

9. ZeroPadded

  • 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>。

10. Multiply

  • 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>。

11. Divide

  • 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>。

12. Unwrap

  • 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。
    • 返回值: 展开后的相位数组。

13. ToComplexNumbers

  • 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.ComplexDiscreteSignalFp32<T> 类

Vorcyc.Mathematics.SignalProcessing.Signals.ComplexDiscreteSignal<T> 是一个用于表示有限复数值离散时间信号的类。信号以一定的采样率存储为两个数据数组(实部和虚部)。

属性

1. SamplingRate

  • public int SamplingRate { get; }
    • 获取采样率(每秒的样本数)。

2. Real

  • public T[] Real { get; }
    • 获取复数值样本的实部。

3. Imag

  • public T[] Imag { get; }
    • 获取复数值样本的虚部。

4. Length

  • public int Length => Real.Length
    • 获取信号的长度。

5. Magnitude

  • public T[] Magnitude
    • 获取复数值样本的幅度。

6. Power

  • public T[] Power
    • 获取复数值样本的功率(幅度的平方)。

7. Phase

  • public T[] Phase
    • 获取复数值样本的相位。

8. PhaseUnwrapped

  • public T[] PhaseUnwrapped
    • 获取复数值样本的展开相位。

方法

1. ComplexDiscreteSignalFp32 构造函数

  • 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。

2. Copy

  • public ComplexDiscreteSignal<T> Copy()
    • 创建信号的深拷贝。
    • 返回值: 信号的深拷贝。

3. 索引器

  • public T this[int index] { get; set; }

    • 样本索引器。仅适用于样本实部数组。谨慎使用。
    • 参数:
      • index: 样本索引。
    • 返回值: 样本的实部值。
  • public ComplexDiscreteSignal<T> this[int startPos, int endPos] { get; }

    • 创建信号的切片。
    • 参数:
      • startPos: 第一个样本的索引(包含)。
      • endPos: 最后一个样本的索引(不包含)。
    • 返回值: 信号的切片。

重载运算符

1. operator +

  • 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: 要添加到每个样本的常数。
    • 返回值: 添加常数后的新信号。

2. operator -

  • public static ComplexDiscreteSignal<T> operator -(ComplexDiscreteSignal<T> s, T constant)
    • 通过从信号 s 中减去常数创建新信号。
    • 参数:
      • s: 信号。
      • constant: 要从每个样本中减去的常数。
    • 返回值: 减去常数后的新信号。

3. operator *

  • 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 类

Vorcyc.Mathematics.SignalProcessing.Signals.DiscreteSignal 是一个用于表示有限实数值离散时间信号的类。信号以一定的采样率存储为一个数据数组。

属性

1. SamplingRate

  • public int SamplingRate { get; }
    • 获取采样率(每秒的样本数)。

2. SampleCount

  • public int SampleCount { get; }
    • 获取样本量,分配后不变。

3. ValidSampleCount

  • public int ValidSampleCount { get; }
    • 获取有效样本量。

4. Duration

  • public TimeSpan Duration { get; }
    • 获取信号的持续时间。

5. Samples

  • public PinnableArray<float> Samples { get; }
    • 获取信号的样本数组。

6. MemoryStrategy

  • public MemoryStrategy MemoryStrategy { get; }
    • 获取信号的内存策略。

方法

1. DiscreteSignal 构造函数

  • 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。

2. Clone

  • public DiscreteSignal Clone()
    • 创建信号的深拷贝。
    • 返回值: 信号的深拷贝。

3. 索引器

  • 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: 样本范围。
    • 返回值: 信号的切片。

4. Energy

  • public float Energy(int startPos, int endPos)

    • 计算信号片段的能量。
    • 参数:
      • startPos: 第一个样本的索引(包含)。
      • endPos: 最后一个样本的索引(不包含)。
    • 返回值: 信号片段的能量。
  • public float Energy(Range range)

    • 计算信号片段的能量。
    • 参数:
      • range: 样本范围。
    • 返回值: 信号片段的能量。
  • public float Energy()

    • 计算整个信号的能量。
    • 返回值: 整个信号的能量。

5. Rms

  • public float Rms(int startPos, int endPos)

    • 计算信号片段的均方根值。
    • 参数:
      • startPos: 第一个样本的索引(包含)。
      • endPos: 最后一个样本的索引(不包含)。
    • 返回值: 信号片段的均方根值。
  • public float Rms(Range range)

    • 计算信号片段的均方根值。
    • 参数:
      • range: 样本范围。
    • 返回值: 信号片段的均方根值。
  • public float Rms()

    • 计算整个信号的均方根值。
    • 返回值: 整个信号的均方根值。

6. ZeroCrossingRate

  • public float ZeroCrossingRate(int startPos, int endPos)

    • 计算信号片段的过零率。
    • 参数:
      • startPos: 第一个样本的索引(包含)。
      • endPos: 最后一个样本的索引(不包含)。
    • 返回值: 信号片段的过零率。
  • public float ZeroCrossingRate(Range range)

    • 计算信号片段的过零率。
    • 参数:
      • range: 样本范围。
    • 返回值: 信号片段的过零率。
  • public float ZeroCrossingRate()

    • 计算整个信号的过零率。
    • 返回值: 整个信号的过零率。

7. Entropy

  • 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。
    • 返回值: 整个信号的香农熵。

重载运算符

1. operator +

  • public static DiscreteSignal operator +(DiscreteSignal s1, DiscreteSignal s2)

    • 通过叠加信号 s1 和 s2 创建新信号。如果大小不同,则较小的信号将广播以适应较大的信号大小。
    • 参数:
      • s1: 第一个信号。
      • s2: 第二个信号。
    • 返回值: 叠加后的新信号。
  • public static DiscreteSignal operator +(DiscreteSignal s, float constant)

    • 通过将常数添加到信号 s 创建新信号。
    • 参数:
      • s: 信号。
      • constant: 要添加到每个样本的常数。
    • 返回值: 添加常数后的新信号。

2. operator -

  • 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: 要从每个样本中减去的常数。
    • 返回值: 减去常数后的新信号。

3. operator *

  • 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> 类

Vorcyc.Mathematics.SignalProcessing.Signals.DiscreteSignal<TSample> 是一个用于表示有限实数值离散时间信号的类。信号以一定的采样率存储为一个数据数组。

属性

1. SamplingRate

  • public int SamplingRate { get; }
    • 获取采样率(每秒的样本数)。

2. SampleCount

  • public int SampleCount { get; }
    • 获取样本量,分配后不变。

3. ValidSampleCount

  • public int ValidSampleCount { get; }
    • 获取有效样本量。

4. Duration

  • public TimeSpan Duration { get; }
    • 获取信号的持续时间。

5. Samples

  • public PinnableArray<TSample> Samples { get; }
    • 获取信号的样本数组。

6. MemoryStrategy

  • public MemoryStrategy MemoryStrategy { get; }
    • 获取信号的内存策略。

方法

1. DiscreteSignal 构造函数

  • 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。

2. Clone

  • public DiscreteSignal<TSample> Clone()
    • 创建信号的深拷贝。
    • 返回值: 信号的深拷贝。

3. 索引器

  • 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: 样本范围。
    • 返回值: 信号的切片。

4. Energy

  • public TSample Energy(int startPos, int endPos)

    • 计算信号片段的能量。
    • 参数:
      • startPos: 第一个样本的索引(包含)。
      • endPos: 最后一个样本的索引(不包含)。
    • 返回值: 信号片段的能量。
  • public TSample Energy(Range range)

    • 计算信号片段的能量。
    • 参数:
      • range: 样本范围。
    • 返回值: 信号片段的能量。
  • public TSample Energy()

    • 计算整个信号的能量。
    • 返回值: 整个信号的能量。

5. Rms

  • public TSample Rms(int startPos, int endPos)

    • 计算信号片段的均方根值。
    • 参数:
      • startPos: 第一个样本的索引(包含)。
      • endPos: 最后一个样本的索引(不包含)。
    • 返回值: 信号片段的均方根值。
  • public TSample Rms(Range range)

    • 计算信号片段的均方根值。
    • 参数:
      • range: 样本范围。
    • 返回值: 信号片段的均方根值。
  • public TSample Rms()

    • 计算整个信号的均方根值。
    • 返回值: 整个信号的均方根值。

6. ZeroCrossingRate

  • public TSample ZeroCrossingRate(int startPos, int endPos)

    • 计算信号片段的过零率。
    • 参数:
      • startPos: 第一个样本的索引(包含)。
      • endPos: 最后一个样本的索引(不包含)。
    • 返回值: 信号片段的过零率。
  • public TSample ZeroCrossingRate(Range range)

    • 计算信号片段的过零率。
    • 参数:
      • range: 样本范围。
    • 返回值: 信号片段的过零率。
  • public TSample ZeroCrossingRate()

    • 计算整个信号的过零率。
    • 返回值: 整个信号的过零率。

7. Entropy

  • 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。
    • 返回值: 整个信号的香农熵。

重载运算符

1. operator +

  • 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: 要添加到每个样本的常数。
    • 返回值: 添加常数后的新信号。

2. operator -

  • 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: 要从每个样本中减去的常数。
    • 返回值: 减去常数后的新信号。

3. operator *

  • 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 类

Vorcyc.Mathematics.SignalProcessing.Signals.DiscreteSignalExtensions 提供了用于处理离散信号的扩展方法。

方法

1. Delay

  • public static DiscreteSignal Delay(this DiscreteSignal signal, int delay)
    • 创建 signal 的延迟副本,通过将其向右(正 delay)或向左(负 delay)移动。
    • 参数:
      • signal: 信号。
      • delay: 延迟(正数或负数的延迟样本数)。
    • 返回值: 延迟后的 DiscreteSignal。

2. Superimpose

  • public static DiscreteSignal Superimpose(this DiscreteSignal signal1, DiscreteSignal signal2)
    • 叠加 signal1 和 signal2。如果大小不同,则较小的信号将广播以适应较大的信号大小。
    • 参数:
      • signal1: 第一个信号。
      • signal2: 第二个信号。
    • 返回值: 叠加后的 DiscreteSignal。

3. SuperimposeMany

  • public static DiscreteSignal SuperimposeMany(this DiscreteSignal signal1, DiscreteSignal signal2, int[] positions)
    • 在给定的 positions 位置处多次叠加 signal2 和 signal1。
    • 参数:
      • signal1: 第一个信号。
      • signal2: 第二个信号。
      • positions: 插入 signal2 的位置(索引)。
    • 返回值: 叠加后的 DiscreteSignal。

4. Subtract

  • public static DiscreteSignal Subtract(this DiscreteSignal signal1, DiscreteSignal signal2)
    • 从 signal1 中减去 signal2。如果大小不同,则较小的信号将广播以适应较大的信号大小。
    • 参数:
      • signal1: 第一个信号。
      • signal2: 第二个信号。
    • 返回值: 减去后的 DiscreteSignal。

5. Concatenate

  • public static DiscreteSignal Concatenate(this DiscreteSignal signal1, DiscreteSignal signal2)
    • 连接 signal1 和 signal2。
    • 参数:
      • signal1: 第一个信号。
      • signal2: 第二个信号。
    • 返回值: 连接后的 DiscreteSignal。

6. Repeat

  • public static DiscreteSignal Repeat(this DiscreteSignal signal, int n)
    • 创建 signal 的副本,并重复 n 次。
    • 参数:
      • signal: 信号。
      • n: 重复次数。
    • 返回值: 重复后的 DiscreteSignal。

7. Amplify

  • public static void Amplify(this DiscreteSignal signal, float coeff)
    • 按 coeff 放大 signal。
    • 参数:
      • signal: 信号。
      • coeff: 放大系数。

8. Attenuate

  • public static void Attenuate(this DiscreteSignal signal, float coeff)
    • 按 coeff 衰减 signal。
    • 参数:
      • signal: 信号。
      • coeff: 衰减系数。

9. Reverse

  • public static void Reverse(this DiscreteSignal signal)
    • 反转 signal。
    • 参数:
      • signal: 信号。

10. First

  • public static DiscreteSignal First(this DiscreteSignal signal, int n)
    • 从 signal 的前 n 个样本创建新信号。
    • 参数:
      • signal: 信号。
      • n: 样本数。
    • 返回值: 新的 DiscreteSignal。

11. Last

  • public static DiscreteSignal Last(this DiscreteSignal signal, int n)
    • 从 signal 的后 n 个样本创建新信号。
    • 参数:
      • signal: 信号。
      • n: 样本数。
    • 返回值: 新的 DiscreteSignal。

12. FullRectify

  • public static void FullRectify(this DiscreteSignal signal)
    • 全波整流 signal。
    • 参数:
      • signal: 信号。

13. HalfRectify

  • public static void HalfRectify(this DiscreteSignal signal)
    • 半波整流 signal。
    • 参数:
      • signal: 信号。

14. NormalizeMax

  • public static void NormalizeMax(this DiscreteSignal signal, int bitsPerSample = 0)
    • 按最大绝对值归一化 signal(范围 [-1, 1])。
    • 参数:
      • signal: 信号。
      • bitsPerSample: 采样位深,默认为 0。

15. ToComplex

  • public static ComplexDiscreteSignalFp32 ToComplex(this DiscreteSignal signal)
    • 从 DiscreteSignal 创建 ComplexDiscreteSignalFp32,虚部将填充为零。
    • 参数:
      • signal: 实值信号。
    • 返回值: 复数值信号 ComplexDiscreteSignalFp32。

16. FadeInFadeOut

  • 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: 淡出持续时间。

17. FadeIn

  • public static void FadeIn(this DiscreteSignal signal, double duration)

    • 对 signal 进行线性淡入。
    • 参数:
      • signal: 信号。
      • duration: 淡入持续时间(秒)。
  • public static void FadeIn(this DiscreteSignal signal, TimeSpan duration)

    • 对 signal 进行线性淡入。
    • 参数:
      • signal: 信号。
      • duration: 淡入持续时间。

18. FadeOut

  • public static void FadeOut(this DiscreteSignal signal, double duration)

    • 对 signal 进行线性淡出。
    • 参数:
      • signal: 信号。
      • duration: 淡出持续时间(秒)。
  • public static void FadeOut(this DiscreteSignal signal, TimeSpan duration)

    • 对 signal 进行线性淡出。
    • 参数:
      • signal: 信号。
      • duration: 淡出持续时间。

19. Crossfade

  • 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);
        }
    }
}

Language / 语言: English · 简体中文


Home


首页

Clone this wiki locally