前言
在信号处理、音频合成、硬件测试等领域,生成连续的正弦波是一项基础需求。本文介绍一个实用的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);
小结
该实现通过简单的状态管理,解决了正弦波生成的连续性 与可控性问题。代码简洁高效。