Çeşitli dijital sinyal işleme algoritmaları kullanarak Java'da işlemek istediğim bir kısa WAV dosyası koleksiyonum var. Bu amaç için 11025 Hz kare hızında kodlanmış bir dizi değerli örnek almam gerekiyor.Java ile bir örnek dizi içine bir WAV dosyası okunurken örnekleme hızı dönüştürme
Kaynak dosyalar 11025 Hz ve 44100 Hz dahil olmak üzere birkaç farklı örnek hızına sahiptir.
// read the WAV file
FileInputStream fileInputStream = new FileInputStream(new File("test.wav"));
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(fileInputStream);
// copy the AudioInputStream to a byte array called buffer
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] data = new byte[4096];
int tempBytesRead = 0;
int byteCounter = 0;
while ((tempBytesRead = audioInputStream.read(data, 0, data.length)) != -1) {
bos.write(data, 0, tempBytesRead);
byteCounter += tempBytesRead;
}
bos.close();
byte[] buffer = bos.toByteArray();
AudioFileFormat audioFileFormat = new AudioFileFormat(AudioFileFormat.Type.WAVE, audioInputStream.getFormat(), (int)audioInputStream.getFrameLength());
// get the resulting sample array
int[] samples = new int[audioFileFormat.getFrameLength()];
for (int i = 0; i < samples.length; i++) {
samples[i] = getSampleValue(i); // the getSampleValue method reads the sample values from the "buffer" array, handling different encoding types like PCM unsigned/signed, mono/stereo, 8 bit/16 bit
}
// RESULT: the "samples" array
sorundur kodu düzgün farklı örnekleme hızları işlemek etmediğini,: İşte onları okumak için kullanmaya çalışıyorum kod. Böylece 44100 Hz kare hızı için 11025 Hz kare hızı için dört kat daha fazla örnek elde ediyorum. Kaynak dosyanın kare hızından bağımsız olarak ortaya çıkan örnek dizisinin 11025 Hz kare hızını kullanmasını istiyorum. Ben AudioInputStream okurken benim için kare hızını dönüştürmek için Java zorlamaya çalıştı, ama şunları birine bir istisna benzer olsun:
java.lang.IllegalArgumentException: Unsupported conversion: PCM_SIGNED 11025.0 Hz, 16 bit, mono, 2 bytes/frame, 44100.0 frames/second, little-endian from PCM_SIGNED 44100.0 Hz, 16 bit, mono, 2 bytes/frame, little-endian
at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:955)
Java Ses API öğretici okuyun: http://java.sun.com/docs/books/tutorial/sound/converters.html. Java Ses API'sinin işletim sistemimin bu tür bir dönüşümünü desteklemediği görülmektedir (Windows 7). Ve herhangi bir dış kütüphaneye bağımlılıktan kaçınmak istiyorum. Örnekleme oranı dönüşümünü kendi başıma yapmanın bir yolu var mı?
Kesme frekansını nasıl hesap ederim? Ve bu adım neden gerekli? – pako
Filtreleme nyquist etkisi nedeniyle neccissary 'dir. Kısacası: sr'niz 11025 hz ise ve girişinizde 5572,5 hz tonu varsa, bu 60 hz ton olarak yeniden üretilecektir. Nyquist wrap tamamen harmonik değildir (çeviri: gerçekten çirkin ve kötü sesler). Nyquist gürültüyü ortadan kaldırmak için yeni sr'inizin üzerindeki tüm girdileri filtrelemelisiniz. –
ve "yeni sr'nizin yarısındaki tüm girdileri filtrele" ile demek istiyorum. Bu frekansın üzerinde sıfır içerik olduğundan emin olun - ve filtreleme miktarını ve kestiğiniz yeri kaynak materyalinize göre değişebilir - sonucu dinleyin, Filtreniz daha dik veya daha düşük bir kesme frekansına ihtiyaç duyuyorsa, eklenen gürültüden belli olacaktır. –