Tag: fft

使用渐变颜色绘制矩阵“Spectrogram”

在使用STFT(短时傅立叶变换)之后,输出是表示3d图的矩阵,好像(A[X, Y] = M) A是输出矩阵,X是时间,Y是频率,并且第三维M是像素颜色强度所示的幅度,如下图所示: 谱图2 如何使用C#中的图片中的渐变颜色绘制输出矩阵A? 是否有一个包含C#频谱图控件的库? 更新: 在对给定算法进行一些修改后我可以绘制光谱图,我没有改变调色板,除了第一种颜色变为黑色但我不知道为什么它会褪色! 这个代表一种声音 再见 再见光谱图 而这是一个pure sine wave所以它几乎都是相同的频率 纯正弦波频谱图 输出被接受它表示输入信号的频率如预期的那样,但我认为有一种方法可以使光谱图像示例中的那样进行说明,请您查看我的代码并建议修改? 这是事件处理程序: private void SpectrogramButton_Click(object sender, EventArgs e) { Complex[][] SpectrogramData = Fourier_Transform.STFT(/*signal:*/ samples, /*windowSize:*/ 512, /*hopSize:*/ 512); SpectrogramBox.Image = Spectrogram.DrawSpectrogram(SpectrogramData, /*Interpolation Factor:*/ 1000, /*Height:*/ 256); } 这是我修改后的绘图function: public static Bitmap DrawSpectrogram(Complex[][] Data, int InterpolationFactor, int Height) { […]

在音频文件中查找音频样本(频谱图已存在)

我想要实现以下目标: 使用Skype,拨打我的邮箱(工作) 输入密码并告诉邮箱我要记录一条新的欢迎信息(有效) 现在,我的邮箱告诉我在发出哔哔声后记录新的欢迎信息 我想等待哔哔声然后播放新消息(不起作用) 我是如何努力实现最后一点的: 使用FFT和滑动窗口(工作)创建频谱图 为哔哔声创建“指纹” 在来自Skype的音频中搜索该指纹 我面临的问题如下: 来自skype和参考蜂鸣声的音频的FFT结果在数字意义上是不同的,即它们相似但不相同,尽管从具有Skype音频记录的音频文件中提取蜂鸣声。 下图显示左侧Skype音频的蜂鸣声频谱图和右侧的参考蜂鸣声频谱图。 如你所见,它们非常相似,但不一样…… 上传了一张图片http://img27.imageshack.us/img27/6717/spectrogram.png 我不知道,怎么从这里继续。 我应该对其进行平均,即将其划分为列和行,并比较这些单元格的平均值,如此处所述? 我不确定这是最好的方法,因为他已经声明,它对短音频样本效果不佳,并且哔哔声的长度不到一秒…… 关于如何进行的任何提示?

简单的就地离散傅立叶变换(DFT)

我正在写一个非常简单的就地DFT。 我正在使用此处显示的公式: http : //en.wikipedia.org/wiki/Discrete_Fourier_transform#Definition以及Euler的公式,以避免仅为此使用复数类。 到目前为止我有这个: private void fft(double[] data) { double[] real = new double[256]; double[] imag = new double[256]; double pi_div_128 = -1 * Math.PI / 128; for (int k = 0; k < 256; k++) { for (int n = 0; n < 256; n++) { real[k] += data[k] * Math.Cos(pi_div_128 * […]

定义频率上的音量(C#)

我不明白为什么音量定义频率不如预期。 我依次用几个指定的频率向我的麦克风发送声音。 然后我做我的麦克风缓冲区的FFT。 退出FFT时,我有一个复数数组。 要知道定义频率上的声音音量,我看看我的数组,我得到这个数组中的元素数: MyFrequency = n*SamplingRate/SizeOfArray. 接下来,我得到复数的大小 (sqrt(Re^2+Im^2) 如果我是对的,这会显示此频率上的声音音量。 但是这个值会根据频率发生很大变化。 如果我错了,请向我解释我需要做些什么来纠正我的错误。 如果我是对的,请解释一下为什么这些价值变化如此之大。

从FFT获取RMS

我得到了一组数据电压,我希望从之前应用的FFT中获得RMS值到该数据。 我已经看到时域中的RMS应该等于Parseval定理的RMS(fft)/ sqrt(nFFT),但给出了不同的结果。 我正在使用这些function:1)FFT public static VectorDPoint FFT(double[] trama, double samplingFreq) { double fs = samplingFreq; // Sampling frequency double t1 = 1 / fs; // Sample time int l = trama.Length; // Length of signal // Time vector //Vector t = Normal(0, l, 1) * t1; //// Values vector //Vector y = new Vector(trama); […]

如何使用谐波产品频谱获得基频?

我正试图从麦克风输入中获得音高。 首先,我通过FFT将信号从时域分解到频域。 在执行FFT之前,我已将Hamming窗口应用于信号。 然后我得到了FFT的复杂结果。 然后我将结果传递给谐波产品光谱,其中结果被下采样,然后乘以下采样峰值,并给出一个复数值。 那我该怎么做才能获得基频? public float[] HarmonicProductSpectrum(Complex[] data) { Complex[] hps2 = Downsample(data, 2); Complex[] hps3 = Downsample(data, 3); Complex[] hps4 = Downsample(data, 4); Complex[] hps5 = Downsample(data, 5); float[] array = new float[hps5.Length]; for (int i = 0; i < array.Length; i++) { checked { array[i] = data[i].X * hps2[i].X * hps3[i].X […]

如何使用NAudio实时计算FFT(ASIO输出)

我正在编写吉他(小提琴)英雄的克隆作为本学年的最终项目。 我的想法是从我的电子小提琴中获取输入,通过FFT进行分析,做一些逻辑并绘制并通过扬声器输出。 也许是并行线程中的一些步骤。 我已经实现了Asio低延迟输入输出,但我在实现实时FFT时遇到了很大的问题。 这是一个与sampleAggregator一起设置asioOut的代码。 样本聚合器应存储每次调用AudioAvailable()时添加的样本,并在样本数超过fftLength时触发FFT计算。 private static int fftLength = 8192; private SampleAggregator sampleAggregator = new SampleAggregator(fftLength); void asioStartPlaying(object sender, EventArgs e) { sampleAggregator.PerformFFT = true; sampleAggregator.FftCalculated += new EventHandler(FftCalculated); var asioOut = new AsioOut(); BufferedWaveProvider wavprov = new BufferedWaveProvider(new WaveFormat(48000, 1)); asioOut.AudioAvailable += new EventHandler (asio_DataAvailable); asioOut.InitRecordAndPlayback(wavprov, 1, 25); asioOut.Play(); } void asio_DataAvailable(object […]

C#库做fft和ifft?

是否有一个免费的c#库来进行快速傅立叶变换及其反演?

频域图像卷积

我想在频域中将Lena卷入其中。 这是一本书的摘录。 这表明卷积的输出应该如何: 我编写了以下应用程序来实现频域中两个图像的卷积。 我遵循的步骤如下: 将Lena转换为复数矩阵。 应用FFT以获得复杂矩阵。 逐个元素地乘以两个复杂矩阵(如果这是卷积的定义)。 将IFFT应用于乘法结果。 输出似乎未达到预期: 这里有两个问题: 输出仅包含黑色背景,其中心只有一个点。 执行卷积后原始图像失真。 。 注意。 FFT和I-FFT与相同的库完美配合。 笔记2。 SO中有一个线程似乎在讨论相同的主题。 。 源代码: public static class Convolution { public static Complex[,] Convolve(Complex[,]image, Complex[,]mask) { Complex[,] convolve = null; int imageWidth = image.GetLength(0); int imageHeight = image.GetLength(1); int maskWidth = mask.GetLength(0); int maskeHeight = mask.GetLength(1); if (imageWidth == maskWidth […]

NAudio fft结果给出所有频率C#的强度

我有一个工作实现NAudio的wasapi环回录制和数据的FFT。 我获得的大部分数据都是应该的,但每隔一段时间(10秒到几分钟的间隔),它几乎在所有频率上都显示振幅。 基本上,图像从右到左滚动,时间和频率从底部的最低频率开始以对数标度进行。 这些线是错误。 据我所知,那些不应该在那里。 我得到音频缓冲区并将样本发送到聚合器(应用汉明窗口),该聚合器实现了NAudio FFT。 在我以任何方式修改它之前检查了数据(FFT结果)(图像不是来自原始FFT输出,而是desibel缩放),确认FFT结果给出了那些线。 我还可以指出图片是用LockBits修改的,所以我认为那里的逻辑有问题,但这就是我查看显示同样问题的FFT输出数据的原因。 好吧,我可能是错的,问题可能在某个地方,我说它不是,但它似乎真的来自FFT或缓冲数据(数据本身或样本的聚合)。 不知怎的,我怀疑缓冲区本身是否像这样被破坏了。 如果有人知道是什么原因造成这种情况我会非常感激! UPDATE 所以我决定绘制整个FFT结果范围而不是它的一半。 它表现出奇怪的一些。 我不确定FFT,但我认为傅立叶变换应该给出一个围绕中间反映的结果。 这当然不是这种情况。 图像是线性比例的,因此图像的精确中间是FFT结果的中间点。 底部是第一个,顶部是最后一个。 我正在播放一个10kHz的正弦波,它给出了两条水平线,但顶部超出了我。 看起来这些线条在图片的底部四分之一处被镜像,所以这对我来说也很奇怪。 更新2 所以我将FFT大小从4096增加到8192再次尝试。 这是我输出正弦频率的输出。 似乎结果反映了两次。 一旦在中间,然后再在上半部和下半部。 现在,巨大的线条已经消失了……看起来这些线条现在只出现在下半部分。 在使用不同的FFT长度进行一些进一步测试之后,该线路中的线条似乎是完全随机的。 更新3 我做过很多测试。 我添加的最新内容是样本重叠,以便在下一个FFT开始时重用示例数组的后半部分。 在汉明和汉恩的窗户上,它给了我很大的强度(就像我发布的第二张照片一样)但不是布莱克曼哈里斯。 禁用重叠可消除每个窗口函数上的最大错误。 即使使用BH窗口,顶部图片中的较小错误仍然存​​在。 我仍然不知道为什么会出现这些线条。 我当前的表单允许控制使用哪个窗口function(前面提到的三个),重叠(开/关)和多个不同的绘图选项。 这允许我在更改时比较所有影响方效果。 我会进一步调查(我很确定我在某些方面犯了一个错误)但是很好的建议非常受欢迎!