Частота звука в Wav файле (найти через Быстрое Преобразование Фурье) - C#
Формулировка задачи:
Собственно, нужно найти частоту звука в Wav файле. Везде говорят о БПФ, но я нигде не нашел понятных новичку примеров.
Нашел код для самого преобразования:
Я не догоняю, что и как надо передать из Wav файла в FFTDb, чтобы получить частоту, в этом вся загвоздка.
Во вложенном файле проект, над которым я сейчас работаю, сейчас программа может генерировать звук, записывать его в Wav файл, открывать и воспроизводить файл. Теперь пытаюсь найти частоту звука в файле и вывести ее в textbox.
using System; using System.Collections.Generic; using System.Text; namespace SoundViewer { public class FourierTransform { static private int n, nu; static private int BitReverse(int j) { int j2; int j1 = j; int k = 0; for (int i = 1; i <= nu; i++) { j2 = j1 / 2; k = 2 * k + j1 - 2 * j2; j1 = j2; } return k; } static public double[] FFTDb(ref double[] x) { // Assume n is a power of 2 n = x.Length; nu = (int)(Math.Log(n) / Math.Log(2)); int n2 = n / 2; int nu1 = nu - 1; double[] xre = new double[n]; double[] xim = new double[n]; double[] decibel = new double[n2]; double tr, ti, p, arg, c, s; for (int i = 0; i < n; i++) { xre[i] = x[i]; xim[i] = 0.0f; } int k = 0; for (int l = 1; l <= nu; l++) { while (k < n) { for (int i = 1; i <= n2; i++) { p = BitReverse(k >> nu1); arg = 2 * (double)Math.PI * p / n; c = (double)Math.Cos(arg); s = (double)Math.Sin(arg); tr = xre[k + n2] * c + xim[k + n2] * s; ti = xim[k + n2] * c - xre[k + n2] * s; xre[k + n2] = xre[k] - tr; xim[k + n2] = xim[k] - ti; xre[k] += tr; xim[k] += ti; k++; } k += n2; } k = 0; nu1--; n2 = n2 / 2; } k = 0; int r; while (k < n) { r = BitReverse(k); if (r > k) { tr = xre[k]; ti = xim[k]; xre[k] = xre[r]; xim[k] = xim[r]; xre[r] = tr; xim[r] = ti; } k++; } for (int i = 0; i < n / 2; i++) decibel[i] = 10.0 * Math.Log10((float)(Math.Sqrt((xre[i] * xre[i]) + (xim[i] * xim[i])))); return decibel; } } }
Решение задачи: «Частота звука в Wav файле (найти через Быстрое Преобразование Фурье)»
textual
Листинг программы
static void Main(string[] args) { double fd = 1000; // частота дискретизации double f1harm = 10; // часота моего "идеального" синуса int samples = 1024; // кол-во отсчетов. для БПФ - СТЕПЕНЬ ДВОЙКИ!!! double phi = 0; // сдвиг фаз double[] timeseries = new double[samples]; for (int i = 0; i < timeseries.Length; i++) timeseries[i] = Math.Sin(2 * Math.PI * f1harm * (double)i / fd + phi); // на этом шаге у меня в массиве идеальный синус с частотой 10Гц double[] spectrum = FourierTransform.FFTDb(ref timeseries); // а вот тут имею спектр через твой же класс БПФ // у него максимум в 10, глянь на другие числа. построй график в excel'е }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д