我正在创建一个简单的Android应用程序,我从智能手机麦克风录制内容,将其保存在文件中,然后播放该文件。
现在我想对该音频文件应用高通滤波器,但为此,我需要先将音频文件转换为浮点数组。有人可以帮我解决一下。
由于
p[s[i-1]]
答案 0 :(得分:2)
字节到浮点转换的细节将取决于您用于音频文件的文件格式。我不知道你的代码是什么格式的。如果您的文件是WAV,44100 fps,16位,小端,立体声(这是标准的Java," CD质量"格式),您可以尝试使用我编写的以下代码。密钥转换点是当两个字节连接并转换为单个数字时(其中"缓冲区"包含从音频文件读入的数据:
float audioVal = ( buffer[bufferIdx++] & 0xff )
| ( buffer[bufferIdx++] << 8 );
如果是大端,则按顺序颠倒。如果是24位或32位,那么你将在&lt;&lt;&lt;&lt;&lt; 16和&lt;&lt;分别为24。对于16位,结果将使用short的范围,因此需要除以32767来将结果标准化为[-1..1]。
我已经在Java上下文中使用了以下一段时间没有问题,但我不知道Android是否支持javax.sound.sampled.AudioInputStream等。也许它仍然有用在文件读取的上下文中的转换?该代码假设我们拥有&#34; CD质量&#34;音频格式,音频文件不超过Integer.MAX帧数。
public float[] loadSoundFileURL(URL url) throws UnsupportedAudioFileException,
IOException
{
AudioInputStream ais = AudioSystem.getAudioInputStream(url);
int framesCount = (int)ais.getFrameLength();
// assuming stereo format, so two entries per frame
float[] temp = new float[framesCount * 2];
long tempCountdown = temp.length;
int bytesRead = 0;
int bufferIdx;
int clipIdx = 0;
byte[] buffer = new byte[1024];
while((bytesRead = ais.read(buffer, 0, 1024)) != -1)
{
bufferIdx = 0;
for (int i = 0, n = (bytesRead >> 1); i < n; i ++)
{
if ( tempCountdown-- >= 0)
{
temp[clipIdx++] =
( buffer[bufferIdx++] & 0xff )
| ( buffer[bufferIdx++] << 8 ) ;
}
}
}
// QUESTION: better to do following in above loop?
for (int i = 0; i < temp.length; i++)
{
temp[i] = temp[i] / 32767f;
}
return temp;
}