我一直在尝试使用智能手机扬声器生成线性Chirp信号。我按照这个等式编写了一个代码,我找到了here。
这个等式对我来说是合乎逻辑的,但是当我试图在24KHz或26KHz等高频下进行测试时,虽然我的智能手机不支持22KHz以上的频率,但声音仍然可以听到并且从扬声器中消失。
如果您发现我的代码有任何问题,请您给予我很大的帮助。
public class MainActivity extends Activity {
int duration=1;
int sampleRate=44100;
int numSample=duration*sampleRate;
double sample[]=new double[numSample];
double freq1=23000;
double freq2=24000;
byte[] generatedSnd= new byte[2*numSample];
Handler handler=new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread thread=new Thread(new Runnable(){
public void run(){
try {
genTone();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
handler.post(new Runnable(){
public void run(){
playSound();
}
});
}
});
thread.start();
}
protected void onResume()
{
super.onResume();
}
void genTone() throws IOException{
double instfreq=0, numerator;
for (int i=0;i<numSample; i++ )
{
numerator=(double)(i)/(double)numSample;
instfreq =freq1+(numerator*(freq2-freq1));
if ((i % 1000) == 0) {
Log.e("Current Freq:", String.format("Freq is: %f at loop %d of %d", instfreq, i, numSample));
}
sample[i]=Math.sin(2*Math.PI*i/(sampleRate/instfreq));
}
int idx = 0;
for (final double dVal : sample) {
// scale to maximum amplitude
final short val = (short) ((dVal * 32767)); // max positive sample for signed 16 bit integers is 32767
// in 16 bit wave PCM, first byte is the low order byte (pcm: pulse control modulation)
generatedSnd[idx++] = (byte) (val & 0x00ff);
generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
}
void playSound(){
AudioTrack audioTrack= null;
try{
audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length, AudioTrack.MODE_STATIC);
audioTrack.write(generatedSnd, 0, generatedSnd.length);
audioTrack.play();
答案 0 :(得分:3)
您遇到的是一种称为锯齿现象。有关更多信息,请阅读有关奈奎斯特定理的信息。基本上这意味着你可以重现任何频率高达采样率的1/2。但是一旦超过该阈值,频率开始向后折叠,使得采样率加1kHz的正弦与采样率减去1kHz的正弦无法区分,依此类推。它与您在电影中看到的东西非常相似,其中车轮似乎停止甚至向后移动(车轮效果)。解决问题的最佳方法是阻止用户输入大于采样率一半的频率。