Нахождение наивысшей частоты из записанного звука включает в себя FFT
Я работаю над проектом, в котором мне нужно создать Tone Listener, чтобы я мог записать звук с помощью класса AudioRecord Android. Этот тональный сигнал слушатель прослушает, а затем выдает частоту тона. Я использую БПФ для получения частоты, но застрял, поскольку она не дает мне точную частоту. Есть ли способ, который может работать? Я в поиске БПФ и аудиозаписей класса Android. Фрагмент кода выглядит следующим образом:
while (isListening) {
for (int t = 0; t <= 5; t++) {
// System.out.println("Inside for loop");
int numberOfShortsRead = audioRecord
.read(audioData,
audioSize,
(kRecorderNumberOfSamples - audioSize));
// System.out.println("Read"+numberOfShortsRead);
if (numberOfShortsRead > 0) {
System.out.println("inside read>0");
System.out.println("Number of read"
+ numberOfShortsRead);
audioSize += numberOfShortsRead;
System.out
.println("Final audio data size"
+ audioSize);
System.out.println("Number Of Samples"
+ kRecorderNumberOfSamples);
if (kRecorderNumberOfSamples == audioSize) {
for (int i = 0; i < audioSize; i++) {
x[i] = audioData[i]; // real
y[i] = 0; // imaginary
}
System.out.println("Inside FFT"
+ "x" + x + "y" + y);
int i, j, k, n1, n2, a;
double c, s, t1, t2;
// Bit-reverse
j = 0;
n2 = n / 2;
for (i = 1; i < n - 1; i++) {
n1 = n2;
while (j >= n1) {
j = j - n1;
n1 = n1 / 2;
}
j = j + n1;
if (i < j) {
t1 = x[i];
x[i] = x[j];
x[j] = t1;
t1 = y[i];
y[i] = y[j];
y[j] = t1;
}
}
// FFT
n1 = 0;
n2 = 1;
for (i = 0; i < m; i++) {
n1 = n2;
n2 = n2 + n2;
a = 0;
for (j = 0; j < n1; j++) {
c = cos[a];
s = sin[a];
a += 1 << (m - i - 1);
for (k = j; k < n; k = k
+ n2) {
t1 = c * x[k + n1] - s
* y[k + n1];
t2 = s * x[k + n1] + c
* y[k + n1];
x[k + n1] = x[k] - t1;
y[k + n1] = y[k] - t2;
x[k] = x[k] + t1;
y[k] = y[k] + t2;
}
}
}
2 ответа
Предполагая, что ваш алгоритм БПФ работает, чтобы получить наиболее заметную частоту в ваших аудиоданных, вы должны найти частоту, где величина наибольшая. Другими словами, найдите точки (ии) данных БПФ, которые имеют наибольшую величину. Если вы хотите Для более точных значений частот вам нужно будет использовать большее N, чтобы получить большее разрешение.
Надеюсь, что помог
Методы оценки частоты, такие как параболическая интерполяция пиковых величин FFT с окнами (или интерполяция Sinc комплексных результатов FFT), могут обеспечить более точную оценку точной частоты, как и использование большего количества данных с более длинным FFT, что обеспечивает более близко расположенную частоту FFT. бункеры результата. Возможно, вам придется буферизовать больше записанных семплов, пока у вас не будет достаточно использования более длинного БПФ. Заполнение нулями перед более длинным БПФ также является другим методом интерполяции для оценки частоты, но результат будет более шумным и, следовательно, менее точным, чем использование большего количества данных.