C# 实时Fft-AsioOut+;样本聚合器
我需要帮助 我目前正在做我的论文项目,这是一个由ASIO驱动程序编写的应用程序。简而言之,写下你玩的游戏。关于Naudio,我是个新手,我有一个将声音转换成FFT的问题。我用一个叫做“GuitarLink”的设备捕捉声音,该设备通过ASIO4ALL运行。 所以我需要实时比较和弦的频率 目前,程序给了我两个值,X和Y。 (我正在使用“SampleAggregator”类和AsioOut) 主要C# 实时Fft-AsioOut+;样本聚合器,c#,wpf,naudio,C#,Wpf,Naudio,我需要帮助 我目前正在做我的论文项目,这是一个由ASIO驱动程序编写的应用程序。简而言之,写下你玩的游戏。关于Naudio,我是个新手,我有一个将声音转换成FFT的问题。我用一个叫做“GuitarLink”的设备捕捉声音,该设备通过ASIO4ALL运行。 所以我需要实时比较和弦的频率 目前,程序给了我两个值,X和Y。 (我正在使用“SampleAggregator”类和AsioOut) 主要 private-SampleAggregator-SampleAggregator=new-Sample
private-SampleAggregator-SampleAggregator=new-SampleAggregator(fftLength);
公共主窗口()
{
初始化组件();
dispatchermer.Tick+=新事件处理程序(SoClose);
Dispatchermer.Interval=新的时间跨度(0,0,0,0,500);
dispatchermer.Start();
}
void SoClose(对象发送方,事件参数e)
{
试一试{
如果(PBass==true){
sampleAggregator.PerformFFT=true;
sampleAggregator.FftCalculated+=新事件处理程序(FftCalculated);
var asioOut=新的asioOut();
BufferedWaveProvider wavprov=新的BufferedWaveProvider(新的波形格式(48000,1));
asioOut.AudioAvailable+=新事件处理程序(asio_数据可用);
asioOut.InitRecordAndPlayback(wavprov,1,25);
玩游戏;
I1E.Text=“”+频率;
}
}
抓住
{
MessageBox.Show(“错误”错误“排除算法和错误”);
}
私有void FftCalculated(对象发送方,FftEventArgs e)
{
//抛出新的NotImplementedException();
对于(var i=0;i
样本聚合器类
public class SampleAggregator
{
// FFT
public event EventHandler<FftEventArgs> FftCalculated;
public bool PerformFFT { get; set; }
// This Complex is NAudio's own!
private Complex[] fftBuffer;
private FftEventArgs fftArgs;
private int fftPos;
private int fftLength;
private int m;
public SampleAggregator(int fftLength)
{
if (!IsPowerOfTwo(fftLength))
{
throw new ArgumentException("FFT Length must be a power of two");
}
this.m = (int)Math.Log(fftLength, 2.0);
this.fftLength = fftLength;
this.fftBuffer = new Complex[fftLength];
this.fftArgs = new FftEventArgs(fftBuffer);
}
bool IsPowerOfTwo(int x)
{
return (x & (x - 1)) == 0;
}
public void Add(float value)
{
if (PerformFFT && FftCalculated != null)
{
// Remember the window function! There are many others as well.
fftBuffer[fftPos].X = (float)(value * FastFourierTransform.HammingWindow(fftPos, fftLength));
fftBuffer[fftPos].Y = 0; // This is always zero with audio.
fftPos++;
if (fftPos >= fftLength)
{
fftPos = 0;
FastFourierTransform.FFT(true, m, fftBuffer);
FftCalculated(this, fftArgs);
}
}
}
}
public class FftEventArgs : EventArgs
{
[DebuggerStepThrough]
public FftEventArgs(Complex[] result)
{
this.Result = result;
}
public Complex[] Result { get; private set; }
public string resultado ="";
void FftCalculated(object sender, FftEventArgs e)
{
}
公共类样本聚合器
{
//快速傅里叶变换
公共事件事件处理程序FFT计算;
公共bool PerformFFT{get;set;}
//这个建筑群是NAudio自己的!
私人综合体[]fftBuffer;
私人FftEventArgs fftArgs;
私人国际保税港区办事处;
私人国际飞行长度;
私有INTM;
公共样本聚合器(int FFTLENGHT)
{
如果(!IsPowerOfTwo(fft长度))
{
抛出新的ArgumentException(“FFT长度必须是2的幂”);
}
this.m=(int)Math.Log(fftLength,2.0);
this.fft长度=fft长度;
this.fftBuffer=新络合物[fftLength];
this.fftArgs=新的FftEventArgs(fftBuffer);
}
bool IsPowerOfTwo(int x)
{
返回值(x&(x-1))==0;
}
公共无效添加(浮动值)
{
if(PerformFFT&&FftCalculated!=null)
{
//记住窗口功能!还有很多其他功能。
fftBuffer[fftPos].X=(float)(值*FastFourierTransform.HammingWindow(fftPos,fftLength));
fftBuffer[fftPos].Y=0;//对于音频,此值始终为零。
fftPos++;
如果(fftPos>=FFTLENGHT)
{
fftPos=0;
快速傅立叶变换(真,m,fftBuffer);
FFT计算(即fftArgs);
}
}
}
}
公共类FftEventArgs:EventArgs
{
[调试步骤至]
公共FftEventArgs(复杂[]结果)
{
结果=结果;
}
公共复合体[]结果{get;private set;}
公共字符串resultado=“”;
void FftCalculated(对象发送方,FftEventArgs e)
{
}
问题是,当我演奏音符时,传递的值不会受到影响
对不起,如果你不懂的话,我的英语不是很好
public class SampleAggregator
{
// FFT
public event EventHandler<FftEventArgs> FftCalculated;
public bool PerformFFT { get; set; }
// This Complex is NAudio's own!
private Complex[] fftBuffer;
private FftEventArgs fftArgs;
private int fftPos;
private int fftLength;
private int m;
public SampleAggregator(int fftLength)
{
if (!IsPowerOfTwo(fftLength))
{
throw new ArgumentException("FFT Length must be a power of two");
}
this.m = (int)Math.Log(fftLength, 2.0);
this.fftLength = fftLength;
this.fftBuffer = new Complex[fftLength];
this.fftArgs = new FftEventArgs(fftBuffer);
}
bool IsPowerOfTwo(int x)
{
return (x & (x - 1)) == 0;
}
public void Add(float value)
{
if (PerformFFT && FftCalculated != null)
{
// Remember the window function! There are many others as well.
fftBuffer[fftPos].X = (float)(value * FastFourierTransform.HammingWindow(fftPos, fftLength));
fftBuffer[fftPos].Y = 0; // This is always zero with audio.
fftPos++;
if (fftPos >= fftLength)
{
fftPos = 0;
FastFourierTransform.FFT(true, m, fftBuffer);
FftCalculated(this, fftArgs);
}
}
}
}
public class FftEventArgs : EventArgs
{
[DebuggerStepThrough]
public FftEventArgs(Complex[] result)
{
this.Result = result;
}
public Complex[] Result { get; private set; }
public string resultado ="";
void FftCalculated(object sender, FftEventArgs e)
{
}