讲解一下下面这段代码: byte[] fingerprint = new byte[0]; Resampler resampler = new Resampler(); int sourceRate = wave.getWaveHeader().getSampleRate(); int targetRate = this.fingerprintProperties.getSampleRate(); byte[] resampledWaveData = resampler.reSample(wave.getBytes(), wave.getWaveHeader().getBitsPerSample(), sourceRate, targetRate); WaveHeader resampledWaveHeader = wave.getWaveHeader(); resampledWaveHeader.setSampleRate(targetRate); Wave resampledWave = new Wave(resampledWaveHeader, resampledWaveData); Spectrogram spectrogram = resampledWave.getSpectrogram(this.sampleSizePerFrame, this.overlapFactor); double[][] spectorgramData = spectrogram.getNormalizedSpectrogramData(); List[] pointsLists = this.getRobustPointList(spectorgramData); int numFrames = pointsLists.length; int[][] coordinates = new int[numFrames][this.numRobustPointsPerFrame]; int i; int j; Iterator byteListIterator; for(int x = 0; x < numFrames; ++x) { if (pointsLists[x].size() == this.numRobustPointsPerFrame) { byteListIterator = pointsLists[x].iterator(); for(j = 0; j < this.numRobustPointsPerFrame; ++j) { coordinates[x][j] = (Integer)byteListIterator.next(); } } else { for(i = 0; i < this.numRobustPointsPerFrame; ++i) { coordinates[x][i] = -1; } } } List<Byte> byteList = new LinkedList(); for(i = 0; i < numFrames; ++i) { for(j = 0; j < this.numRobustPointsPerFrame; ++j) { if (coordinates[i][j] != -1) { byteList.add((byte)(i >> 8)); byteList.add((byte)i); int y = coordinates[i][j]; byteList.add((byte)(y >> 8)); byteList.add((byte)y); int intensity = (int)(spectorgramData[i][y] * 2.147483647E9); byteList.add((byte)(intensity >> 24)); byteList.add((byte)(intensity >> 16)); byteList.add((byte)(intensity >> 8)); byteList.add((byte)intensity); } } } fingerprint = new byte[byteList.size()]; byteListIterator = byteList.iterator(); for(j = 0; byteListIterator.hasNext(); fingerprint[j++] = (Byte)byteListIterator.next()) { } return fingerprint;
时间: 2024-01-23 21:03:53 浏览: 48
Matlab指纹识别代码:FingerPrint Recognition-matlab开发
这段代码是用于生成音频指纹的。具体来说,它包括以下步骤:
1. 通过Resampler对音频进行重采样,将采样率从原始采样率调整为目标采样率。
2. 利用重采样后的音频数据,生成语谱图(Spectrogram),并获取其规范化后的语谱图数据。
3. 对语谱图数据进行处理,获取其中的关键点,即音频指纹中的参考点。
4. 按照一定格式将关键点信息转换为字节流,并将其存储在一个List中。
5. 将List中的字节流转换为字节数组,生成最终的音频指纹。
具体来说,代码中的变量和方法含义如下:
- fingerprint:存储生成的音频指纹。
- Resampler:用于对音频进行重采样的类。
- sourceRate:原始采样率。
- targetRate:目标采样率。
- resampledWaveData:重采样后的音频数据。
- Spectrogram:用于生成语谱图的类。
- sampleSizePerFrame:每帧的采样点数。
- overlapFactor:帧之间的重叠部分占比。
- spectorgramData:规范化后的语谱图数据。
- pointsLists:音频指纹中的关键点信息。
- numFrames:语谱图中的帧数。
- numRobustPointsPerFrame:每帧中的关键点数。
- coordinates:存储关键点坐标信息的数组。
- byteList:用于存储关键点信息的List。
- intensity:关键点的强度值。
总之,这段代码是实现了一种基于语谱图的音频指纹生成算法,通过对语音信号的处理,提取出其中的关键信息,生成一个用于唯一标识该音频的指纹。
阅读全文