作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的目标是使用 Android 的 AudioTrack 生成正弦波、正方形、三角波 和锯齿波 信号 类。
我已经尝试基于 tutorial .它的效果相对较好,尽管我并不总是确定生成的频率与目标频率相对应的准确性。
我想制作正方形、三角形等功能。本教程仅实现正弦。因此我的问题是:
样本究竟是如何工作的
new Thread( new Runnable( )
{
public void run( )
{
final float frequency = 440;
float increment = (float)(2*Math.PI) * frequency / 44100; // angular increment for each sample
float angle = 0;
AudioDevice device = new AndroidAudioDevice( );
float samples[] = new float[1024];
while( true )
{
for( int i = 0; i < samples.length; i++ )
{
samples[i] = (float)Math.sin( angle );
angle += increment;
}
device.writeSamples( samples );
}
}
} ).start();
我可以像下面这样(使用 signum 函数)将正弦变成正方形吗?
samples[i] = (float)Math.signum(Math.sin( angle ));
基本上,我想从根本上理解正在编写的示例,因此我可以生成各种信号并最终叠加它们。
感谢您的宝贵时间!
最佳答案
我知道这已经有一年了,但是......是的,signum 应该可以正常工作。放弃角度和增量业务。
此代码叠加两个信号 - 不同频率的正方形和三角形。
int rate = 44100;
AudioDevice device = new AndroidAudioDevice( );
float samples[] = new float[1024];
while( true )
{
for( int i = 0; i < samples.length; i++ )
{
samples[i] = (float)(0.5*Math.signum(Math.sin(550*2*Math.PI*i/rate))+0.5*Math.asin(Math.sin(450*2*Math.PI*i/rate)));
}
device.writeSamples( samples );
}
顺便说一句,做平方的更好方法可能是:((550.0*2*i/rate)%2<0?-1:1)
关于java - 使用 Android 的 AudioTrack 类生成正弦波、方波、三角波、锯齿波音频信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3986248/
我有一个绕其 3 轴旋转的立方体,当 key[a] == true 时,它会向左旋转,就好像它正在滚动一样。将立方体向任何方向旋转 45 度,将其向后旋转 90 度,以获得继续的错觉。这将保持 3
我是一名优秀的程序员,十分优秀!