android - 在android中生成线性调频信号

标签 android audio signals

我一直在尝试使用智能手机扬声器生成线性线性调频信号。我按照我发现的这个等式写了一个代码 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();

最佳答案

您遇到的是一种称为混叠的现象。有关更多信息,请阅读奈奎斯特定理。从本质上讲,这意味着您可以重现高达采样率 1/2 的任何频率。但是,一旦您超过该阈值,频率就会开始折返,以至于采样率加 1kHz 的正弦波与采样率负 1kHz 的正弦波无法区分,依此类推。这与您可能在电影中看到的非常相似,其中车轮似乎停止甚至向后移动(车轮效应)。解决您问题的最佳方法是防止用户输入大于采样率一半的频率。

关于android - 在android中生成线性调频信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23154609/

相关文章:

Linux PTY 作为模块,但没有信号

python - Python "while True"循环中的 time.sleep 混淆

java - Android Studio 登录 Activity

vb.net - 声音样本的数学分析(作为数字数组)

java - AudioTrack WRITE_BLOCKING 与 WRITE_NON_BLOCKING

c++ - 如何在程序播放的同时播放声音?

c++ - Qt C++ : Linking multiple instances of a QPushButton subclass using Signals/Slots

java - 即使不需要 ScrollView,如何使 Activity 可滚动?

java - 如何在不使用任何加密格式的情况下使用 "PUSH"检索 Firebase 中的子数据

java - 将 html 字符串转换为 java 字符串,删除 html、css 等标签