首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用相位产生正弦波

利用相位产生正弦波
EN

Stack Overflow用户
提问于 2016-03-16 21:32:04
回答 3查看 334关注 0票数 1

我正在用下面的方法产生一个正弦波-

代码语言:javascript
复制
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信号-

代码语言:javascript
复制
if (phase > 1)  
{  
  float temp = phase - 1;  
  phase = temp;  
}  

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

EN

回答 3

Stack Overflow用户

发布于 2016-03-17 04:05:24

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

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

从技术上讲,您的第一个陈述是不正确的,因为它的措辞。FS/2是nyquist值。您可以生成高于此频率的频率,但它们会产生混叠。

在相位包装方面,有不同的方法来管理这一点。

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

乐于接受更多知识丰富的人的指正。

票数 1
EN

Stack Overflow用户

发布于 2016-03-23 20:59:55

我不确定,但我相信问题可能是:

代码语言:javascript
复制
theta = phase * 2 * PI;  

我想Xcode会把结果改成一个整数。您可能想要尝试:

代码语言:javascript
复制
theta = phase * 2.0 * PI;  

相反,并确保您的PI变量是一个double

所有这些都让DSP.SE偏离了主题。:-)

票数 0
EN

Stack Overflow用户

发布于 2017-09-20 09:18:00

@cixelsyd有正确的公式...以下是基于采样率创建给定频率的一组样本的代码

代码语言:javascript
复制
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的计算移到循环之外。注意阶段是一个常量,因为它只是给出了一个初始偏移量

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36179393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档