Module_SignalProcessing_Features_zh - vorcyc/Vorcyc.Mathematics GitHub Wiki

当前位置 : 首页/信号处理模块/其他音频特征计算

信号处理模块 - Signal Processing Module

其他音频特征计算 - Features

Vorcyc.Mathematics.SignalProcessing.Features 命名空间包含多种音频特征计算类,包括 Harmonic、Perceptual、Pitch 和 Spectral。这些类提供了丰富的音频特征计算功能,如谐波特征、感知特征、音高估计和谱特征,适用于各种音频信号处理需求。

以下类型均位于 Vorcyc.Mathematics.SignalProcessing.Features 命名空间。


:ledger:目录


Vorcyc.Mathematics.SignalProcessing.Features.Harmonic 类

Vorcyc.Mathematics.SignalProcessing.Features.Harmonic 是一个静态类,提供计算谐波谱特征的方法。

方法

1. Peaks

  • public static void Peaks(float[] spectrum, int[] peaks, float[] peakFrequencies, int samplingRate, float pitch = -1)
    • 查找频谱中的谐波峰值(峰值索引和频率)。
    • 参数:
      • spectrum: 频谱。
      • peaks: 用于存储计算的峰值位置的数组。
      • peakFrequencies: 用于存储计算的峰值频率的数组。
      • samplingRate: 采样率。
      • pitch: 以 Hz 为单位的音高,如果音高未知,则为负数。

2. Centroid

  • public static float Centroid(float[] spectrum, int[] peaks, float[] peakFrequencies)
    • 计算谐波质心。
    • 参数:
      • spectrum: 频谱。
      • peaks: 峰值位置(频谱中的索引)。
      • peakFrequencies: 峰值频率。
    • 返回值: 谐波质心。

3. Spread

  • public static float Spread(float[] spectrum, int[] peaks, float[] peakFrequencies)
    • 计算谐波扩展。
    • 参数:
      • spectrum: 频谱。
      • peaks: 峰值位置(频谱中的索引)。
      • peakFrequencies: 峰值频率。
    • 返回值: 谐波扩展。

4. Inharmonicity

  • public static float Inharmonicity(float[] spectrum, int[] peaks, float[] peakFrequencies)
    • 计算非谐性。
    • 参数:
      • spectrum: 频谱。
      • peaks: 峰值位置(频谱中的索引)。
      • peakFrequencies: 峰值频率。
    • 返回值: 非谐性。

5. OddToEvenRatio

  • public static float OddToEvenRatio(float[] spectrum, int[] peaks)
    • 计算奇偶比。
    • 参数:
      • spectrum: 频谱。
      • peaks: 峰值位置(频谱中的索引)。
    • 返回值: 奇偶比。

6. Tristimulus

  • public static float Tristimulus(float[] spectrum, int[] peaks, int n)
    • 计算三刺激(第 n 个分量)。
    • 参数:
      • spectrum: 频谱。
      • peaks: 峰值位置(频谱中的索引)。
      • n: 三刺激分量索引:1、2 或 3。
    • 返回值: 三刺激分量。

代码示例

以下是一个使用 Harmonic 类中多个方法的示例,并在示例中加入了注释:

using System;
using Vorcyc.Mathematics.SignalProcessing.Features;

public class HarmonicExample
{
    public static void Main()
    {
        // 定义频谱
        float[] spectrum = { 0.5f, 0.6f, 0.55f, 0.7f, 0.65f, 0.8f, 0.75f, 0.9f, 0.85f, 1.0f }; int[] peaks = new int[5];
        float[] peakFrequencies = new float[5]; int samplingRate = 44100;
        // 查找谐波峰值
        Harmonic.Peaks(spectrum, peaks, peakFrequencies, samplingRate);

        // 计算谐波质心
        float centroid = Harmonic.Centroid(spectrum, peaks, peakFrequencies);
        Console.WriteLine($"Harmonic Centroid: {centroid}");

        // 计算谐波扩展
        float spread = Harmonic.Spread(spectrum, peaks, peakFrequencies);
        Console.WriteLine($"Harmonic Spread: {spread}");

        // 计算非谐性
        float inharmonicity = Harmonic.Inharmonicity(spectrum, peaks, peakFrequencies);
        Console.WriteLine($"Inharmonicity: {inharmonicity}");

        // 计算奇偶比
        float oddToEvenRatio = Harmonic.OddToEvenRatio(spectrum, peaks);
        Console.WriteLine($"Odd to Even Ratio: {oddToEvenRatio}");

        // 计算三刺激分量
        float tristimulus1 = Harmonic.Tristimulus(spectrum, peaks, 1);
        float tristimulus2 = Harmonic.Tristimulus(spectrum, peaks, 2);
        float tristimulus3 = Harmonic.Tristimulus(spectrum, peaks, 3);
        Console.WriteLine($"Tristimulus 1: {tristimulus1}");
        Console.WriteLine($"Tristimulus 2: {tristimulus2}");
        Console.WriteLine($"Tristimulus 3: {tristimulus3}");
    }
}

Vorcyc.Mathematics.SignalProcessing.Features.Perceptual 类

Vorcyc.Mathematics.SignalProcessing.Features.Perceptual 是一个静态类,提供计算感知音频特征的方法。

方法

1. Loudness

  • public static float Loudness(float[] spectralBands)
    • 计算感知响度(特定响度的总和:N'(z) = E(z)^0.23)。
    • 参数:
      • spectralBands: 给定频带中的能量数组。
    • 返回值: 感知响度。

2. Sharpness

  • public static float Sharpness(float[] spectralBands)
    • 计算感知锐度(本质上是频谱质心的等效物)。
    • 参数:
      • spectralBands: 给定频带中的能量数组。
    • 返回值: 感知锐度。

代码示例

以下是一个使用 Perceptual 类中多个方法的示例,并在示例中加入了注释:

using System;
using Vorcyc.Mathematics.SignalProcessing.Features;

public class PerceptualExample
{
    public static void Main()
    {
        // 定义频带能量
        float[] spectralBands = { 0.5f, 0.6f, 0.55f, 0.7f, 0.65f };
        // 计算感知响度
        float loudness = Perceptual.Loudness(spectralBands);
        Console.WriteLine($"Loudness: {loudness}");

        // 计算感知锐度
        float sharpness = Perceptual.Sharpness(spectralBands);
        Console.WriteLine($"Sharpness: {sharpness}");
    }
}

Vorcyc.Mathematics.SignalProcessing.Features.Pitch 类

Vorcyc.Mathematics.SignalProcessing.Features.Pitch 是一个静态类,提供音高估计和跟踪的方法。

方法

1. FromAutoCorrelation

  • public static float FromAutoCorrelation(float[] samples, int samplingRate, int startPos = 0, int endPos = -1, float low = 80, float high = 400)
    • 使用自相关方法从样本中估计音高。
    • 参数:
      • samples: 样本数组。
      • samplingRate: 采样率。
      • startPos: 要处理的数组中的第一个样本的索引。
      • endPos: 要处理的数组中的最后一个样本的索引(不包括)。
      • low: 预期音高范围的下限频率。
      • high: 预期音高范围的上限频率。
    • 返回值: 估计的音高。

2. FromAutoCorrelation

  • public static float FromAutoCorrelation(Signal signal, int startPos = 0, int endPos = -1, float low = 80, float high = 400)
    • 使用自相关方法从信号中估计音高。
    • 参数:
      • signal: 信号。
      • startPos: 要处理的信号中的第一个样本的索引。
      • endPos: 要处理的信号中的最后一个样本的索引(不包括)。
      • low: 预期音高范围的下限频率。
      • high: 预期音高范围的上限频率。
    • 返回值: 估计的音高。

3. FromZeroCrossingsSchmitt

  • public static float FromZeroCrossingsSchmitt(float[] samples, int samplingRate, int startPos = 0, int endPos = -1, float lowSchmittThreshold = -1e10f, float highSchmittThreshold = 1e10f)
    • 基于零交叉率和施密特触发器从样本中估计音高。
    • 参数:
      • samples: 样本数组。
      • samplingRate: 采样率。
      • startPos: 要处理的数组中的第一个样本的索引。
      • endPos: 要处理的数组中的最后一个样本的索引(不包括)。
      • lowSchmittThreshold: 施密特触发器的下限阈值。
      • highSchmittThreshold: 施密特触发器的上限阈值。
    • 返回值: 估计的音高。

4. FromZeroCrossingsSchmitt

  • public static float FromZeroCrossingsSchmitt(Signal signal, int startPos = 0, int endPos = -1, float lowSchmittThreshold = -1e10f, float highSchmittThreshold = 1e10f)
    • 基于零交叉率和施密特触发器从信号中估计音高。
    • 参数:
      • signal: 信号。
      • startPos: 要处理的信号中的第一个样本的索引。
      • endPos: 要处理的信号中的最后一个样本的索引(不包括)。
      • lowSchmittThreshold: 施密特触发器的下限阈值。
      • highSchmittThreshold: 施密特触发器的上限阈值。
    • 返回值: 估计的音高。

5. FromYin

  • public static float FromYin(float[] samples, int samplingRate, int startPos = 0, int endPos = -1, float low = 80, float high = 400, float cmdfThreshold = 0.2f)
    • 使用 YIN 算法从样本中估计音高。
    • 参数:
      • samples: 样本数组。
      • samplingRate: 采样率。
      • startPos: 要处理的数组中的第一个样本的索引。
      • endPos: 要处理的数组中的最后一个样本的索引(不包括)。
      • low: 预期音高范围的下限频率。
      • high: 预期音高范围的上限频率。
      • cmdfThreshold: CMDF 阈值。
    • 返回值: 估计的音高。

6. FromYin

  • public static float FromYin(Signal signal, int startPos = 0, int endPos = -1, float low = 80, float high = 400, float cmdfThreshold = 0.2f)
    • 使用 YIN 算法从信号中估计音高。
    • 参数:
      • signal: 信号。
      • startPos: 要处理的信号中的第一个样本的索引。
      • endPos: 要处理的信号中的最后一个样本的索引(不包括)。
      • low: 预期音高范围的下限频率。
      • high: 预期音高范围的上限频率。
      • cmdfThreshold: CMDF 阈值。
    • 返回值: 估计的音高。

7. FromHss

  • public static float FromHss(Signal signal, int startPos = 0, int endPos = -1, float low = 80, float high = 400, int fftSize = 0)
    • 使用谐波和频谱(HSS)方法从信号中估计音高。
    • 参数:
      • signal: 信号。
      • startPos: 要处理的信号中的第一个样本的索引。
      • endPos: 要处理的信号中的最后一个样本的索引(不包括)。
      • low: 预期音高范围的下限频率。
      • high: 预期音高范围的上限频率。
      • fftSize: FFT 大小。
    • 返回值: 估计的音高。

8. FromHss

  • public static float FromHss(float[] spectrum, int samplingRate, float low = 80, float high = 400)
    • 使用谐波和频谱(HSS)方法从频谱中估计音高。
    • 参数:
      • spectrum: 频谱。
      • samplingRate: 采样率。
      • low: 预期音高范围的下限频率。
      • high: 预期音高范围的上限频率。
    • 返回值: 估计的音高。

9. FromHps

  • public static float FromHps(Signal signal, int startPos = 0, int endPos = -1, float low = 80, float high = 400, int fftSize = 0)
    • 使用谐波积和频谱(HPS)方法从信号中估计音高。
    • 参数:
      • signal: 信号。
      • startPos: 要处理的信号中的第一个样本的索引。
      • endPos: 要处理的信号中的最后一个样本的索引(不包括)。
      • low: 预期音高范围的下限频率。
      • high: 预期音高范围的上限频率。
      • fftSize: FFT 大小。
    • 返回值: 估计的音高。

10. FromHps

  • public static float FromHps(float[] spectrum, int samplingRate, float low = 80, float high = 400)
    • 使用谐波积和频谱(HPS)方法从频谱中估计音高。
    • 参数:
      • spectrum: 频谱。
      • samplingRate: 采样率。
      • low: 预期音高范围的下限频率。
      • high: 预期音高范围的上限频率。
    • 返回值: 估计的音高。

11. FromSpectralPeaks

  • public static float FromSpectralPeaks(Signal signal, int startPos = 0, int endPos = -1, float low = 80, float high = 400, int fftSize = 0)
    • 基于频谱峰值从信号中估计音高。
    • 参数:
      • signal: 信号。
      • startPos: 要处理的信号中的第一个样本的索引。
      • endPos: 要处理的信号中的最后一个样本的索引(不包括)。
      • low: 预期音高范围的下限频率。
      • high: 预期音高范围的上限频率。
      • fftSize: FFT 大小。
    • 返回值: 估计的音高。

12. FromSpectralPeaks

  • public static float FromSpectralPeaks(float[] spectrum, int samplingRate, float low = 80, float high = 400)
    • 基于频谱峰值从频谱中估计音高。
    • 参数:
      • spectrum: 频谱。
      • samplingRate: 采样率。
      • low: 预期音高范围的下限频率。
      • high: 预期音高范围的上限频率。
    • 返回值: 估计的音高。

13. FromCepstrum

  • public static float FromCepstrum(Signal signal, int startPos = 0, int endPos = -1, float low = 80, float high = 400, int cepstrumSize = 256, int fftSize = 1024)
    • 基于倒谱从信号中估计音高。
    • 参数:
      • signal: 信号。
      • startPos: 要处理的信号中的第一个样本的索引。
      • endPos: 要处理的信号中的最后一个样本的索引(不包括)。
      • low: 预期音高范围的下限频率。
      • high: 预期音高范围的上限频率。
      • cepstrumSize: 倒谱大小。
      • fftSize: FFT 大小。
    • 返回值: 估计的音高。

代码示例

以下是一个使用 Pitch 类中多个方法的示例,并在示例中加入了注释:

using System;
using Vorcyc.Mathematics.SignalProcessing;
using Vorcyc.Mathematics.SignalProcessing.Features;
using Vorcyc.Mathematics.SignalProcessing.Signals;

public class PitchExample
{
    public static void Main()
    {
        // 定义输入信号
        float[] samples = { 0.5f, 0.6f, 0.55f, 0.7f, 0.65f }; var signal = Signal.FromCopy(samples, 44100f);
        // 使用自相关方法估计音高
        float pitchAutoCorrelation = Pitch.FromAutoCorrelation(signal);
        Console.WriteLine($"Pitch (AutoCorrelation): {pitchAutoCorrelation} Hz");

        // 使用零交叉率和施密特触发器估计音高
        float pitchZeroCrossingsSchmitt = Pitch.FromZeroCrossingsSchmitt(signal);
        Console.WriteLine($"Pitch (ZeroCrossingsSchmitt): {pitchZeroCrossingsSchmitt} Hz");

        // 使用 YIN 算法估计音高
        float pitchYin = Pitch.FromYin(signal);
        Console.WriteLine($"Pitch (Yin): {pitchYin} Hz");

        // 使用谐波和频谱(HSS)方法估计音高
        float pitchHss = Pitch.FromHss(signal);
        Console.WriteLine($"Pitch (Hss): {pitchHss} Hz");

        // 使用谐波积和频谱(HPS)方法估计音高
        float pitchHps = Pitch.FromHps(signal);
        Console.WriteLine($"Pitch (Hps): {pitchHps} Hz");

        // 基于频谱峰值估计音高
        float pitchSpectralPeaks = Pitch.FromSpectralPeaks(signal);
        Console.WriteLine($"Pitch (SpectralPeaks): {pitchSpectralPeaks} Hz");

        // 基于倒谱估计音高
        float pitchCepstrum = Pitch.FromCepstrum(signal);
        Console.WriteLine($"Pitch (Cepstrum): {pitchCepstrum} Hz");
    }
}

Vorcyc.Mathematics.SignalProcessing.Features.Spectral 类

Vorcyc.Mathematics.SignalProcessing.Features.Spectral 是一个静态类,提供计算谱特征的方法。

方法

1. Centroid

  • public static float Centroid(float[] spectrum, float[] frequencies)
    • 计算谱质心。
    • 参数:
      • spectrum: 频谱。
      • frequencies: 中心频率。
    • 返回值: 谱质心。

2. Spread

  • public static float Spread(float[] spectrum, float[] frequencies)
    • 计算谱扩展。
    • 参数:
      • spectrum: 频谱。
      • frequencies: 中心频率。
    • 返回值: 谱扩展。

3. Decrease

  • public static float Decrease(float[] spectrum)
    • 计算谱衰减。
    • 参数:
      • spectrum: 频谱。
    • 返回值: 谱衰减。

4. Flatness

  • public static float Flatness(float[] spectrum, float minLevel = 1e-10f)
    • 计算谱平坦度。
    • 参数:
      • spectrum: 频谱。
      • minLevel: 振幅阈值。
    • 返回值: 谱平坦度。

5. Noiseness

  • public static float Noiseness(float[] spectrum, float[] frequencies, float noiseFrequency = 3000)
    • 计算谱噪声度。
    • 参数:
      • spectrum: 频谱。
      • frequencies: 中心频率。
      • noiseFrequency: 噪声的下限频率。
    • 返回值: 谱噪声度。

6. Rolloff

  • public static float Rolloff(float[] spectrum, float[] frequencies, float rolloffPercent = 0.85f)
    • 计算谱滚降频率。
    • 参数:
      • spectrum: 频谱。
      • frequencies: 中心频率。
      • rolloffPercent: 滚降百分比。
    • 返回值: 谱滚降频率。

7. Crest

  • public static float Crest(float[] spectrum)
    • 计算谱峰度。
    • 参数:
      • spectrum: 频谱。
    • 返回值: 谱峰度。

8. Contrast

  • public static float[] Contrast(float[] spectrum, float[] frequencies, float minFrequency = 200, int bandCount = 6)
    • 计算谱带中的谱对比度数组。
    • 参数:
      • spectrum: 频谱。
      • frequencies: 中心频率。
      • minFrequency: 起始频率。
      • bandCount: 谱带数量。
    • 返回值: 谱对比度数组。

9. Contrast

  • public static float Contrast(float[] spectrum, float[] frequencies, int bandNo, float minFrequency = 200)
    • 计算谱带索引为 bandNo 的谱对比度。
    • 参数:
      • spectrum: 频谱。
      • frequencies: 中心频率。
      • bandNo: 谱带索引。
      • minFrequency: 起始频率。
    • 返回值: 谱对比度。

10. Entropy

  • public static float Entropy(float[] spectrum)
    • 计算频谱的香农熵(频谱被视为概率密度函数)。
    • 参数:
      • spectrum: 频谱。
    • 返回值: 频谱的香农熵。

代码示例

以下是一个使用 Spectral 类中多个方法的示例,并在示例中加入了注释:

using System;
using Vorcyc.Mathematics.SignalProcessing.Features;

public class SpectralExample
{
    public static void Main()
    {
        // 定义频谱和中心频率
        float[] spectrum = { 0.5f, 0.6f, 0.55f, 0.7f, 0.65f, 0.8f, 0.75f, 0.9f, 0.85f, 1.0f };
        float[] frequencies = { 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000 };

        // 计算谱质心
        float centroid = Spectral.Centroid(spectrum, frequencies);
        Console.WriteLine($"Spectral Centroid: {centroid}");

        // 计算谱扩展
        float spread = Spectral.Spread(spectrum, frequencies);
        Console.WriteLine($"Spectral Spread: {spread}");

        // 计算谱衰减
        float decrease = Spectral.Decrease(spectrum);
        Console.WriteLine($"Spectral Decrease: {decrease}");

        // 计算谱平坦度
        float flatness = Spectral.Flatness(spectrum);
        Console.WriteLine($"Spectral Flatness: {flatness}");

        // 计算谱噪声度
        float noiseness = Spectral.Noiseness(spectrum, frequencies);
        Console.WriteLine($"Spectral Noiseness: {noiseness}");

        // 计算谱滚降频率
        float rolloff = Spectral.Rolloff(spectrum, frequencies);
        Console.WriteLine($"Spectral Rolloff: {rolloff}");

        // 计算谱峰度
        float crest = Spectral.Crest(spectrum);
        Console.WriteLine($"Spectral Crest: {crest}");

        // 计算谱对比度数组
        float[] contrast = Spectral.Contrast(spectrum, frequencies);
        Console.WriteLine("Spectral Contrast:");
        foreach (var value in contrast)
        {
            Console.WriteLine(value);
        }

        // 计算频谱的香农熵
        float entropy = Spectral.Entropy(spectrum);
        Console.WriteLine($"Spectral Entropy: {entropy}");
    }
}