是否有基于FFT的2D互相关或卷积函数内置于scipy(或其他流行的库)?
有这样的功能:
scipy.signal.correlate2d- "实施的直接方法convolveND对于大数据来说会很慢"scipy.ndimage.correlate - "使用精确计算(即不是FFT)将数组与给定内核相关联."scipy.fftpack.convolve.convolve,我真的不明白,但似乎错了numarray有一个correlate2d()带fft=True开关的功能,但我猜numarray被折叠成numpy,我无法找到是否包含此功能.
有限的资源,如较慢的CPU,代码大小和RAM,如何最好地检测音符的音高,类似于电子或软件调谐器会做什么?
我应该使用:
其他?
简而言之,我要做的是识别单个音符,在中间C到两个八度音程之上的两个八度音阶,在任何(合理的)乐器上演奏.我希望在半音的20%范围内 - 换句话说,如果用户播放太平或太尖锐,我需要区分它.但是,我不需要调整所需的准确度.
我一直在使用FFT的Exocortex实现,但我遇到了一些问题.
每当我在调用iFFT之前修改频率区间的幅度时,结果信号包含一些咔嗒声和砰砰声,特别是当信号中存在低频时(如鼓或低音).但是,如果我用相同的因子衰减所有的箱子,就不会发生这种情况.
让我举一个4样本FFT输出缓冲区的例子:
// Bin 0 (DC)
FFTOut[0] = 0.0000610351563
FFTOut[1] = 0.0
// Bin 1
FFTOut[2] = 0.000331878662
FFTOut[3] = 0.000629425049
// Bin 2
FFTOut[4] = -0.0000381469727
FFTOut[5] = 0.0
// Bin 3, this is the first and only negative frequency bin.
FFTOut[6] = 0.000331878662
FFTOut[7] = -0.000629425049
Run Code Online (Sandbox Code Playgroud)
输出由成对的浮点组成,每个浮点数代表单个bin的实部和虚部.因此,bin 0(数组索引0,1)将代表DC频率的实部和虚部.正如你所看到的,第1和第3个箱子都有相同的值(除了Im部分的符号),所以我猜bin 3是第一个负频率,最后索引(4,5)将是最后的正值频率仓.
然后,为了衰减频率仓1,这就是我所做的:
// Attenuate the 'positive' bin
FFTOut[2] *= 0.5;
FFTOut[3] *= 0.5;
// Attenuate its corresponding negative bin.
FFTOut[6] *= 0.5;
FFTOut[7] *= 0.5;
Run Code Online (Sandbox Code Playgroud)
对于实际测试,我使用1024长度的FFT,我总是提供所有样本,因此不需要0填充.
// Attenuate
var …Run Code Online (Sandbox Code Playgroud) 我有周期T的周期函数,想知道如何获得傅立叶系数列表.我尝试从numpy 使用fft模块,但它似乎更专注于傅立叶变换而不是系列.也许它缺乏数学知识,但我看不出如何从fft计算傅里叶系数.
帮助和/或示例表示赞赏.
但是......为什么我需要对样本应用窗口函数?这到底意味着什么?
功率谱怎么样,它是采样率范围内每个频率的功率?(例如:windows media player声音可视化器?)
我正在使用SDK for iOS 5.0和XCode 4.2开发iOS应用程序.
我想开发一个识别声音的应用程序.我看到有一个名为Sound Hound的应用程序可以识别音乐并告诉艺术家和标题.
我怎么能做类似的事情?我想将声音与现有声音数据库进行比较.我怎样才能做到这一点?
也许我可以使用傅立叶变换.我不知道如何处理声音.或者它可能类似于语音识别,不是吗?
傅立叶变换F的幅度和相位定义为:
Mag = sqrt(Real(F)^2 + Imaginary(F)^2)
Run Code Online (Sandbox Code Playgroud)
和
Phase = arctan(Imaginary(F)/Real(F))
Run Code Online (Sandbox Code Playgroud)
我曾尝试编写matlab代码,该代码采用灰度图像矩阵,对矩阵执行fft2(),然后根据变换计算幅度和相位.然后我想计算傅里叶变换的虚部和实部.这是通过将前两个方程重新排列为:
Real = Mag/sqrt(1 + tan(Phase)^2)
Run Code Online (Sandbox Code Playgroud)
和
Imaginary = Real*tan(Phase)
Run Code Online (Sandbox Code Playgroud)
最后组合和逆fft2:
F = Real + i*Imaginary
image = ifft2(F)
Run Code Online (Sandbox Code Playgroud)
我希望看到与输入相同的图像,但我得到了垃圾.我的数学错了吗?我的matlab mfile代码如下:
function y = forwardBackwardFFT(image)
F = fft2(image);
mag = sqrt(real(F).^2 + imag(F).^2);
phase = atan(imag(F)./real(F));
re = sqrt((mag.^2)./(1 + tan(phase).^2));
im = re.*tan(phase);
F = re + i*im;
f = ifft2(F);
subplot(1,2,1);
imshow(image);
Title('Original Image');
subplot(1,2,2);
imshow(f);
Title('Image after forward and backward FFT');
y = f;
Run Code Online (Sandbox Code Playgroud)
非常感谢 :)
所以我知道FFT的卷积比现实空间中的卷积具有更低的计算复杂度.但是FFT卷积的缺点是什么?
内核大小是否始终必须与图像大小匹配,或者是否有用于处理此问题的函数,例如在pythons numpy和scipy包中?那么抗锯齿效果呢?
我正在寻找一个可以接受一大块音频数据并在给定频段内返回平均幅度的库.
我已经在comp.dsp上问了这个问题,但我很清楚,使用基本的FFT库获取自己构建这个问题的技术诀窍将需要比现在更多的时间和精力.以下是我的原始问题以及更多详情:http://groups.google.com/group/comp.dsp/browse_thread/thread/e04f78d439e9e2bd
我发现了许多用于播放声音的漂亮库(过去我使用过JSyn),但似乎没有设置它们来返回有关声音样本的快速和脏的光谱信息.
任何指针都将非常感激.
我正在看这个Web Audio API演示,这本好书的一部分
如果你看一下演示,fft峰值会顺利下降.我正在尝试使用minim库来处理Java模式下的Processing.我已经看过如何使用doFFTAnalysis()方法中的web音频api完成此操作,并尝试使用minim复制它.我还尝试移植abs()如何处理复杂类型:
/ 26.2.7/3 abs(__z): Returns the magnitude of __z.
00565 template<typename _Tp>
00566 inline _Tp
00567 __complex_abs(const complex<_Tp>& __z)
00568 {
00569 _Tp __x = __z.real();
00570 _Tp __y = __z.imag();
00571 const _Tp __s = std::max(abs(__x), abs(__y));
00572 if (__s == _Tp()) // well ...
00573 return __s;
00574 __x /= __s;
00575 __y /= __s;
00576 return __s * sqrt(__x * __x + __y * __y);
00577 }
00578 …Run Code Online (Sandbox Code Playgroud)