我正在使用以下方法生成正弦波-

sampling rate = 22050;
theta = 0;

for (i = 0; i < N; i++)
{
 theta = phase * 2 * PI;
 signal[i] = amplitude * sin(theta);
 phase = phase + frequency/sampling rate;
}

当我生成频率为8000 Hz的信号时,输出中会出现失真。低于此频率(例如6000 Hz)的频率会正确产生。如果我像这样检查相位,则会正确产生8000 Hz信号-
if (phase > 1)
{
  float temp = phase - 1;
  phase = temp;
}

我认为这与Xcode中的正弦函数有关,可能是它可以接受的一系列值?在Matlab中,带有和不带有相位环绕的相同代码没有区别。有人可以解释这里发生了什么吗?

最佳答案

我相信计算应该是(2.0 * PI)*频率/采样

这将为您提供下一个弧度相位增量。然后可以将该值输入到Sin函数中以计算相位。注意,您需要累积弧度值。

从技术上讲,您的第一个陈述在措词上是不正确的。 FS / 2是奈奎斯特值。您可以产生高于此的频率,但是它们会混叠。

在阶段包装方面,有不同的方法来管理它。

我对弧度的理解是,当相位围绕2 pi值旋转时,相位的“线性”表示不会重复。因此,如果您通过管理弧度来管理相位,则可能不会出现包装问题。

很高兴被更多知识渊博的人纠正。

10-08 14:06