5.正弦波生成器:支持连续相位与可控重置 C# + WPF 完整示例

前言

在信号处理、音频合成、硬件测试等领域,生成连续的正弦波是一项基础需求。本文介绍一个实用的C#正弦波生成方法,支持相位连续 和计数器重置功能。

核心代码

cs 复制代码
//正弦波点数计数器,每次生成从上次结束点继续
private int _sineCount = 0;

/// <summary>
/// 生成正弦波
/// </summary>
/// <param name="amplitude">幅度</param>
/// <param name="pointsPerPeriod">每个周期的点数</param>
/// <param name="waveformLength">波形长度(点数)</param>
/// <param name="startPhase">起始相位(弧度,可选,默认0)</param>
/// <param name="resetPoints">重置点数(可选,达到此点数后重置_sineCount,默认-1表示不重置)</param>
/// <returns>正弦波数组</returns>
public double[] GenerateSinewave(double amplitude=1, int pointsPerPeriod=50, int waveformLength=500, double startPhase = 0, int resetPoints = -1)
{
    double[] waveform = new double[waveformLength];

    for (int i = 0; i < waveformLength; i++)
    {
        // 计算当前点的相位:起始相位 + 已运行点数对应的相位
        double phase = startPhase + 2 * Math.PI * _sineCount / pointsPerPeriod;
        waveform[i] = amplitude * Math.Sin(phase);

        _sineCount++;

        // 检查是否需要重置计数器
        if (resetPoints > 0 && _sineCount >= resetPoints)
        {
            _sineCount = 0;
        }
    }

    return waveform;
}

设计亮点

1. 相位连续性

通过成员变量 _sineCount 记录全局点数,确保多次调用时波形无缝衔接。第一次调用生成0~499点,第二次调用从第500点开始,避免相位跳变。

2. 灵活的重置机制

resetPoints 参数控制计数器重置时机:

  • -1(默认):永不重置,适合无限连续波形

  • N:生成N点后自动归零,适合固定长度循环

3. 参数化配置

参数 说明 典型值
amplitude 峰值幅度 1.0(归一化)
pointsPerPeriod 采样密度 50(高频)/ 1000(高精度)
startPhase 初始相位偏移 Math.PI/2(余弦波)

使用示例

复制代码
var generator = new SineGenerator();

// 生成两段连续的正弦波(共1000点)
var wave1 = generator.GenerateSinewave(waveformLength: 500);
var wave2 = generator.GenerateSinewave(waveformLength: 500); // 无缝衔接

// 每1000点重置一次(循环播放)
var cyclicWave = generator.GenerateSinewave(
    waveformLength: 2000, 
    resetPoints: 1000);

小结

该实现通过简单的状态管理,解决了正弦波生成的连续性 与可控性问题。代码简洁高效。

相关推荐
Jeff-Tsai1 天前
Day 14:业务对象的扩展点与重写时机
.net·架构设计·erp·definition-driven
郝学胜-神的一滴1 天前
AI 编程智能体 27:吃透MCP通信机制
人工智能·python·langchain·wpf·numpy·scikit-learn
IT规划师1 天前
Redis 数据类型全解 - GEO 地理空间:附近的人、外卖、打车——背后原理与精度陷阱(九)
redis·.net
波力海苔夹心脆6752 天前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
陈仓主教2 天前
# WPF CheckBox 控件详解与使用—WPF 中的控件(6)--复选框控件(CheckBox)
wpf
追逐时光者2 天前
一款基于 .NET 开源、免费的数据库自治诊断平台
后端·.net
AI导出鸭PC端2 天前
Perplexity批量导出没有PDF模式?AI导出鸭插件补上最后一块拼图
人工智能·pdf·c#·ai导出鸭
追逐时光者2 天前
让 GitHub Copilot 更懂你的 .NET 代码风格:一份精简实用的 Copilot Instructions
后端·.net
Jeff-Tsai2 天前
Day 13:Session 管理与生命周期
.net·架构设计·erp·definition-driven