Частота звука в Wav файле (найти через Быстрое Преобразование Фурье) - C#

Узнай цену своей работы

Формулировка задачи:

Собственно, нужно найти частоту звука в Wav файле. Везде говорят о БПФ, но я нигде не нашел понятных новичку примеров. Нашел код для самого преобразования:
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 файла в FFTDb, чтобы получить частоту, в этом вся загвоздка. Во вложенном файле проект, над которым я сейчас работаю, сейчас программа может генерировать звук, записывать его в Wav файл, открывать и воспроизводить файл. Теперь пытаюсь найти частоту звука в файле и вывести ее в textbox.

Решение задачи: «Частота звука в 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'е
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5
Похожие ответы