java – 使用频率从android获取超声波
发布时间:2020-12-15 04:23:26 所属栏目:Java 来源:网络整理
导读:我希望从任何 Android设备获得超声波,例如频率介于18KHz和19KHz之间的超声波. 我使用下面的代码来计算频率,但它似乎没有让我得到正确的频率.我的频率保持在11 KHz和13KHz之间. private void calculateFrequency(){ // 1 - Initialize audio int channel_conf
我希望从任何
Android设备获得超声波,例如频率介于18KHz和19KHz之间的超声波.
我使用下面的代码来计算频率,但它似乎没有让我得到正确的频率.我的频率保持在11 KHz和13KHz之间. private void calculateFrequency() { // 1 - Initialize audio int channel_config = AudioFormat.CHANNEL_CONFIGURATION_MONO; int format = AudioFormat.ENCODING_PCM_16BIT; int sampleRate = 8000; int bufferSize = 2048; if (bufferSize < AudioRecord.getMinBufferSize(sampleRate,channel_config,format)) bufferSize = AudioRecord.getMinBufferSize(sampleRate,format); AudioRecord audioInput = new AudioRecord(AudioSource.MIC,sampleRate,format,bufferSize); // 2 - Get sound byte[] audioBuffer = new byte[bufferSize]; audioInput.startRecording(); int nbRead = audioInput.read(audioBuffer,bufferSize); audioInput.stop(); audioInput.release(); // 3 - Transform to double array double[] micBufferData = new double[bufferSize]; final int bytesPerSample = 2; // As it is 16bit PCM final double amplification = 100.0; // choose a number as you like for (int index = 0,floatIndex = 0; index < nbRead - bytesPerSample + 1; index += bytesPerSample,floatIndex++) { double sample = 0; for (int b = 0; b < bytesPerSample; b++) { int v = audioBuffer[index + b]; if (b < bytesPerSample - 1 || bytesPerSample == 1) { v &= 0xFF; } sample += v << (b * 8); } double sample32 = amplification * (sample / 32768.0); micBufferData[floatIndex] = sample32; } // 4 - Create complex array Complex[] fftTempArray = new Complex[bufferSize]; for (int i=0; i<bufferSize; i++) { fftTempArray[i] = new Complex(micBufferData[i],0); } // 5 - Calculate FFT Complex[] fftArray = FFT.fft(fftTempArray); // 6 - Calculate magnitude double[] magnitude = new double[bufferSize / 2]; for (int i = 0; i < (bufferSize / 2); i++) { magnitude[i] = Math.sqrt(fftArray[i*2].re() * fftArray[i*2].re() + fftArray[i*2].im() * fftArray[i*2].im()); } // 7 - Get maximum magnitude double max_magnitude = -1; for (int i = 0; i < bufferSize / 2; i++) { if (magnitude[i] > max_magnitude) { max_magnitude = magnitude[i]; } } // 8 - Calculate frequency int freq = (int)(max_magnitude * sampleRate / bufferSize); ((TextView) findViewById(R.id.textView1)).setText("FREQUENCY = " + freq + "Hz"); } 我正在使用两部手机:一部分用this app发送超声波,另一部用于超声波. 我的代码出了什么问题? 解决方法
为了获得正确的非混叠频率估计,必须使用更多的采样率(可能比滤波器滚降更大10%到20%),而不是音频输入中最高频率的两倍,因此超过两倍你想要找到的最高频率.
这是由于采样定理所需的奈奎斯特速率. 因此,如果要查找19 kHz信号,则需要接近48000的采样率. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Java集合之ArrayList源码分析
- java – MediaPlayer停止并重新启动
- java – 哪一个使用数组列表更有效?
- Java压缩或放大图像处理
- jsf – java.lang.NoClassDefFoundError:javax / servlet
- Fork and Join: Java Can Excel at Painless Parallel Prog
- java – 有没有办法只在Tomcat / Wildfly / Glassfish启动时
- java – 如何测试sql脚本是junit测试中的标准sql?
- 如何从Java中的xml Document对象中删除encoding =“UTF-8”
- Spring Boot集成ElasticSearch实现搜索引擎的示例
推荐文章
站长推荐
- java – 摆脱SWT中的闪烁
- java – 如何将十六进制值传递给字符串 – Andro
- java – Float.equals(几乎)是完全无用的,我应该
- Monitor and diagnose performance in Java SE 6
- Spring Boot中整合Spring Security并自定义验证代
- JSP Request.getAttribute()方法:获取指定的属性
- java利用SMB读取远程文件的方法
- 如何用Java中的Graphics2D旋转文本?
- java – GrizzlyServerFactory.createHttpServer
- Java – 注册所有使用@MyAnnotation注释的类
热点阅读