giant18 Ответов: 1

Как найти разницу между двумя быстрыми преобразованиями Фурье (fft) в виде presantage (%) в C# или в VB.NET


how to find difference between two Fast Fourier transform (fft) as presantage(%)

в c# или в vb.net

Что я уже пробовал:

find difference between two Fast Fourier transform (fft)

it is an array of single so i want compare two result of two .wav sound and know the different between it in %

Patrice T

найти математика

Ralf Meier

И... что ты пробовал ...?
Каков результат вашего БПФ ? Массив одиночных ? Кривая (которая представлена массивом единичных) ?
Если вы хотите получить помощь, вы должны быть гораздо более конкретными ... !!!

giant18

массив единичный, поэтому я хочу сравнить два результата из двух .wav звук и знать разницу между ним в %

Ralf Meier

Вы пытались вычесть содержимое из обоих элементов массива и построить новый массив, который содержит только разницу ?
Это может быть первым шагом к получению алгоритма ...

giant18

да я пробовал но не нашел хорошего результата

Ralf Meier

Хорошо ... тогда вам следует улучшить этот вопрос с помощью вашего кода, который показывает, что вы пробовали и как вы это сделали, и, возможно, мы вместе найдем решение для вас ...

giant18

сравнение 2 аудиофайлов приводит к БПФ в c# или в vb.net у меня есть результат fft для каждого аудио в двойном массиве я хочу знать из результата fft процент сходства или различий между двумя аудио

Dim fft1new As Double() = FftAlgorithm.Вычислить(GetSamplesForMonoWav("C:\Users\e1.wav", h2)) Dim fft2new As Double() = FftAlgorithm.Вычислить(GetSamplesForMonoWav("C:\Users\e2.wav", h2))

Ralf Meier

ОК... это код, который показывает, как вы получаете БПФ-данные в свою систему.
Каждый из этих элементов массива теперь должен представлять частоту и ее количество внутри аудиосигнала.
Теперь вы должны построить 3-й массив с размером наибольшего исходного массива, который содержит отличия от обоих исходных массивов.
Это различие может быть построено с помощью цикла.
Если оба исходных массива имеют один и тот же FFT-результат, то ваш результирующий массив должен иметь в основном содержимое "0". В этом случае у вас есть хорошая партия. В других случаях вы должны найти свой собственный рейтинг.

Я бы посоветовал вам попробовать ...

giant18

я пробую этот код, но он плохо работает

Дим Формулы-1 двойной = ничего
Для каждого f как Double в fft1new
f1 += f
Следующий

Dim f2 как Double = Nothing
Для каждого f как Double в fft2new
f2 += f
Следующий


Тусклый f5 как двойной
Dim f4 As Double = (((f2 - f1) / f2) * 100).Метод toString("#0.0")
Если f1 = f2, то
f5 = 0
Еще


Если f1 > f2, то
f5 = ((f1 / f2)).Метод toString("#0.00")
Еще
f5 = ((f2 / f1)).Метод toString("#0.00")
Конец, Если
Конец, Если

MsgBox(f5)

Ralf Meier

Это не имеет ничего общего с описанием, которое я вам предложил ...
Так... если ваш код "не работает хорошо" - почему бы вам не попробовать мой sugesstion ?

giant18

я не понимаю можете ли вы привести мне пример

Ralf Meier

Я имею в виду его как этот :

Dim FFTResult(1) As Double

Частная Суб FFT_Test()
Dim maxArray = Math.Max(FFT1new.Граф, FFT2new.Граф) - 1
ReDim FFTResult(maxArray)
Дим, В1, В2, А двойной

For i As Integer = 0 To maxArray
w1 = 0
Если я < FFT1new.Посчитайте тогда w1 = FFT1new(i)
w2 = 0
Если я < FFT2new.Посчитайте тогда w2 = FFT2new(i)

FFTResult(i) = Math.Abs(w1 - w2)
Следующий
Конец Подводной Лодки

Теперь вы должны отобразить FFTResult-массив в диаграмму, чтобы увидеть, что у вас есть.
После этого (возможно) вы могли бы решить, как идти дальше.

giant18

я пытаюсь это сделать но это не дает мне то что я хочу спасибо за помощь

Ralf Meier

Как я уже описывал ранее :
- Я не знаю, как выглядит содержимое ваших массивов данных.
- так что я не знаю, как может выглядеть возможный результат.
- поэтому я не могу решить, какие критерии должны быть заполнены для "совпадения" или "не совпадения"
Но если ты сделаешь это так, как описал я, то сможешь ...

1 Ответов

Рейтинг:
1

Anks007

Хии giant18,

Я хотел сделать то же самое и для этого использовал следующий метод.
Первый массив данных X и второй массив данных Ю. Я выполнил на нем метод среднеквадратичной ошибки, так как работаю на C++.

double meanSquareError(double *X,double *Y,uint16_t sizeOfArray)
{
	double sumOfSquare=0;

	for(uint16_t i=0;i<(Tempsamples/2);i++)
	{
		sumOfSquare = sumOfSquare + pow((X[i]-Y[i]),2);
	}

	return sqrt(sumOfSquare);
}


Я получаю большое число за небольшую разницу, Я применил это к результатам БПФ.
Если у вас есть какое-то решение лучше, чем у меня, то, пожалуйста, поделитесь им со мной.

Вы можете посетить эту ссылку для получения дополнительной информации http://biomedicalsignalandimage.blogspot.com/2016/03/the-method-of-comparing-two-audio-files.html

Спасибо