我正在用下面的方法产生一个正弦波-
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中,有和没有相位包裹的相同代码没有区别。有人能解释一下这里发生了什么吗?
发布于 2016-03-17 04:05:24
我认为计算应该是(2.0 * PI) *频率/采样率
这将为您提供以弧度为单位的下一阶段增量。然后,可以将该值输入Sin函数以计算相位。请注意,您需要累积弧度值。
从技术上讲,您的第一个陈述是不正确的,因为它的措辞。FS/2是nyquist值。您可以生成高于此频率的频率,但它们会产生混叠。
在相位包装方面,有不同的方法来管理这一点。
我对弧度的理解是,它是相位的“线性”表示,当相位围绕2pi值旋转时,它不会重复。因此,如果您通过管理弧度来管理阶段,则可能不会出现包裹问题。
乐于接受更多知识丰富的人的指正。
发布于 2016-03-23 20:59:55
我不确定,但我相信问题可能是:
theta = phase * 2 * PI; 我想Xcode会把结果改成一个整数。您可能想要尝试:
theta = phase * 2.0 * PI; 相反,并确保您的PI变量是一个double。
所有这些都让DSP.SE偏离了主题。:-)
发布于 2017-09-20 09:18:00
@cixelsyd有正确的公式...以下是基于采样率创建给定频率的一组样本的代码
incr_theta := (2.0 * math.Pi * given_freq) / samples_per_second
phase := -1.74 // given phase ... typically 0 note its a constant
theta := 0.0
for curr_sample := 0; curr_sample < number_of_samples; curr_sample++ {
source_buffer[curr_sample] = math.Sin(theta + phase)
theta += incr_theta
}为了提高效率,最好将delta的计算移到循环之外。注意阶段是一个常量,因为它只是给出了一个初始偏移量
https://stackoverflow.com/questions/36179393
复制相似问题