Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#NAudio FFT输出解释_C#_Xna_Fft_Naudio - Fatal编程技术网

C#NAudio FFT输出解释

C#NAudio FFT输出解释,c#,xna,fft,naudio,C#,Xna,Fft,Naudio,我目前正在用NAudio和XNA编写一个MusicPlayer,我认为将所有频率的强度与Monstercat视频(例如:watch?v=VGh5DV0D3wk)相似的图表可视化是个好主意。 经过短暂的互联网搜索,我找到了FFT,并使用NAudio方法将其实现到我的程序中。然后我试图将结果可视化,但它看起来不像频率/振幅图 我用这个视频中的不同频率做了一些测试:watch?v=4Av788P9stk 我想在这里添加图片,但我没有足够的声誉这么做 publicstaticvoid UpdateW

我目前正在用NAudio和XNA编写一个MusicPlayer,我认为将所有频率的强度与Monstercat视频(例如:watch?v=VGh5DV0D3wk)相似的图表可视化是个好主意。 经过短暂的互联网搜索,我找到了FFT,并使用NAudio方法将其实现到我的程序中。然后我试图将结果可视化,但它看起来不像频率/振幅图

我用这个视频中的不同频率做了一些测试:watch?v=4Av788P9stk 我想在这里添加图片,但我没有足够的声誉这么做

publicstaticvoid UpdateWaveBuffer()
{
buffer=新字节[bufferLength];
WaveBuffer=新浮点[bufferLength/4];
if(Channel32!=null&&Channel32读取器!=null)
{
//我有两个WaveChannel32对象,一个用于播放歌曲,另一个用于播放歌曲
//从当前位置实时读取数据
//这不是最有效的方法,但我以后会改进的
Channel32读卡器位置=Channel32位置;
int Read=Channel32Reader.Read(缓冲区,0,缓冲区长度);
//在可读数据中转换字节缓冲区
对于(int i=0;i
以及绘制方法:

// FFT Line Graph
        if (VisSetting == Visualizations.fftline && Assets.Channel32 != null)
        {
            spriteBatch.Begin();

            //float Length = Assets.FFToutput.Length / 2f;
            float Length = Assets.FFToutput.Length;

            // Shadow
            for (int i = 0; i < Length; i++)
            {
                double value = Math.Sqrt(Assets.FFToutput[i]) * 1000;

                if (value > 100)
                    value = 100;

                Assets.DrawLine(new Vector2((i - 1) * Values.WindowSize.X / Length + 5,
                                Values.WindowSize.Y / 2f + (int)value + 5),

                                new Vector2(i * Values.WindowSize.X / Length + 5,
                                Values.WindowSize.Y / 2f - (int)value + 5),

                                2, Color.Black * 0.6f, spriteBatch);
            }

            for (int i = 0; i < Length; i++)
            {
                double value = Math.Sqrt(Assets.FFToutput[i]) * 1000;

                if (value > 100)
                    value = 100;

                Assets.DrawLine(new Vector2((i - 1) * Values.WindowSize.X / Length,
                                Values.WindowSize.Y / 2f + (int)value),

                                new Vector2(i * Values.WindowSize.X / Length,
                                Values.WindowSize.Y / 2f - (int)value),

                                2, Color.Lerp(primaryColor, secondaryColor, i / Length), spriteBatch);
            }

            spriteBatch.End();
        }
//FFT线图
if(VisSetting==Visualizations.fftline&&Assets.Channel32!=null)
{
spriteBatch.Begin();
//浮动长度=Assets.FFToutput.Length/2f;
浮动长度=Assets.FFToutput.Length;
//影子
for(int i=0;i100)
数值=100;
Assets.drawine(新矢量2((i-1)*value.WindowSize.X/长度+5,
值.WindowSize.Y/2f+(int)值+5),
新矢量2(i*Values.WindowSize.X/Length+5,
值.WindowSize.Y/2f-(int)值+5),
2,彩色。黑色*0.6f,雪碧色);
}
for(int i=0;i100)
数值=100;
Assets.drawine(新矢量2((i-1)*value.WindowSize.X/长度,
Values.WindowSize.Y/2f+(int)值),
新矢量2(i*Values.WindowSize.X/Length,
Values.WindowSize.Y/2f-(int)值),
2,颜色。Lerp(原色,第二色,i/长度),spriteBatch;
}
spriteBatch.End();
}

出于某种原因,您似乎要取两次平方根(一次在FFT代码中,然后在draw方法中)?另外,由于人类的听力是对数的,所以通常绘制对数量级,而不是线性的。因此,您可以完全删除平方根并将其与日志组合,例如,
FFToutput[i]=10.0*Math.Log10(tempbuffer[i].X*tempbuffer[i].X)+(tempbuffer[i].Y*tempbuffer[i].Y)@PaulR我已经在玩输出了。^^使用对数函数会导致FFToutput具有几乎相似的值。没有声音是真正可识别的…出于某种原因,您似乎要取平方根两次(一次在FFT代码中,然后在draw方法中)?另外,由于人类的听力是对数的,所以通常绘制对数量级,而不是线性的。因此,您可以完全删除平方根并将其与日志组合,例如,
FFToutput[i]=10.0*Math.Log10(tempbuffer[i].X*tempbuffer[i].X)+(tempbuffer[i].Y*tempbuffer[i].Y)@PaulR我已经在玩输出了。^^使用对数函数会导致FFToutput具有几乎相似的值。没有任何声音是真正可以辨认的。。。
// FFT Line Graph
        if (VisSetting == Visualizations.fftline && Assets.Channel32 != null)
        {
            spriteBatch.Begin();

            //float Length = Assets.FFToutput.Length / 2f;
            float Length = Assets.FFToutput.Length;

            // Shadow
            for (int i = 0; i < Length; i++)
            {
                double value = Math.Sqrt(Assets.FFToutput[i]) * 1000;

                if (value > 100)
                    value = 100;

                Assets.DrawLine(new Vector2((i - 1) * Values.WindowSize.X / Length + 5,
                                Values.WindowSize.Y / 2f + (int)value + 5),

                                new Vector2(i * Values.WindowSize.X / Length + 5,
                                Values.WindowSize.Y / 2f - (int)value + 5),

                                2, Color.Black * 0.6f, spriteBatch);
            }

            for (int i = 0; i < Length; i++)
            {
                double value = Math.Sqrt(Assets.FFToutput[i]) * 1000;

                if (value > 100)
                    value = 100;

                Assets.DrawLine(new Vector2((i - 1) * Values.WindowSize.X / Length,
                                Values.WindowSize.Y / 2f + (int)value),

                                new Vector2(i * Values.WindowSize.X / Length,
                                Values.WindowSize.Y / 2f - (int)value),

                                2, Color.Lerp(primaryColor, secondaryColor, i / Length), spriteBatch);
            }

            spriteBatch.End();
        }