我正在制作一个复音音乐转录项目.我已经阅读了一些论文,并阅读了解释类似任务的文章.我对问题领域的许多方面感到非常困惑.希望有人能够帮助我.
到目前为止,我已经从给定的mp3获得了解码音频数据流.
我已经了解起病检测是转录的第一步..是否有可用的Java库可用于检测开始.
接下来,如我所读,使用FFT也可以检测基频.
我想知道在这些任务中使用FFT.(我对FFT不熟悉).是否必须执行FFT以进行起始检测和F0检测.如果不是其他方式.我可以在我的音频流上执行FFT,或者是否需要执行其他操作才能操作这些音频数据.
非常感谢.
我从事音频处理项目,需要进行大量的基本计算(+, - ,*),如FFT(快速傅里叶变换)计算.
我们正在考虑使用显卡来加速这些计算.但我们不知道这是否是最好的解决方案.我们理想的解决方案需要是一个价格低于500美元的好计算系统.
我们使用Matlab编程,我们有声卡采集必须插入系统.
你知道除了显卡+主板以外的解决方案吗?
我是FFT概念的初学者,所以我理解的是,如果我输入1024个信号,我将获得513个区间,范围从0hz到22050Hz(在44100Hz采样率的情况下).在Cinder中使用KISS FFT,getBinSize函数返回1024个信号输入的预期513值.我不明白为什么会出现重复的峰值.运行经过20Hz到22000Hz频率(按顺序)的测试音频样本,我看到整个时间有两个峰值.它看起来像:
__ _ __ |__ _ __ _ __ |__ _ __
随着音频播放,峰值似乎彼此相向移动,因此第二个峰值似乎确实是第一个峰值的镜像副本.我经历过的每个例子似乎只是继续绘制所有513个值并且它们似乎没有这个镜像问题.我不确定我错过了什么.
我在使用CUDA FFT库时遇到一些问题。
我将输入声明为cuDoubleComplex,但编译器返回以下错误:此类型与cufftComplex类型的参数不兼容。通过Internet搜索后,我发现文件cufft.h,其中有一行typedef cuComplex cufftComplex;。我的问题是,在cuComplex.h库中,很显然cuComplex具有单浮点精度(typedef cuFloatComplex cuComplex;),但是我想要双精度。
这可能吗?
特别是,我获得以下信息:
error: argument of type "cufftDoubleComplex *" is incompatible with parameter of type "cufftComplex *"
Run Code Online (Sandbox Code Playgroud)
在这一行:
cufftExecC2C(plan, data1, data2, CUFFT_FORWARD);
Run Code Online (Sandbox Code Playgroud) 我有一个4096个采样长44.1 kHz的音频剪辑.在应用FFT之后,我获得了4096个频段.
然后每个频段将跨越10.77 Hz(44100/4096).
我被告知频率的下半部分与前半部分共轭对称.
考虑到这是我上面的计算正确还是我错过了重要的事情?
想法是Phone A同时发送声音信号和蓝牙信号,Phone B将计算两个信号之间的延迟.
在实践中,我得到了不一致的结果,延迟时间从90ms到160ms.我尽可能地尝试优化两端.
在输出端:
在AudioTrack.write和AudioTrack处于流模式之后,
一旦蓝牙和音频输出都有自己的线程
蓝牙仅输出,就会生成音调,因此它
应该在写入完成之前开始输出.
在接收端:
再次两个单独的线程
在每个AudioRecord.read之前记录系统时间
采样规格:
44.1khz
读取整个缓冲区
使用fft一次采样100个样本
考虑自初始读取后转换的样本数量()
我正在使用应用程序来增强图像FFT.
我已经实现了以下代码FFT:

对于上图中的第一个公式,我实现了如下代码:
void fft(int x , int y , int size) {
for(int i=x; i<x+32 ; i++){
for(int j=y ; j<y+32 ; j++){
double kth = -2 * Math.PI * (((i*x)/size)+((j*y)/size));
ComplexNumber expo = new ComplexNumber(Math.cos(kth),Math.sin(kth));
output.values[i][j] = ComplexNumber.cMult(input.values[x][y],expo) ;
intermediate.values[i][j] = output.values[i][j];
input.values[i][j] = output.values[i][j];
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还实现了第二个和第三个公式的代码,但我得到的结果不正确.我该怎么办 ?
为第一个方程实现的代码是否正确?
编辑
我已尝试在指纹图像上使用Catalano框架中的建议函数.应用Catalano框架后输入图像和输出图像:
输入图像

傅里叶变换

频率滤波器

产量

当我将它应用于指纹图像时,输入图像和输出图像之间的差异并不那么有效.即使在应用FFT之后,指纹图像中的脊和谷之间的对比也不能明显区分.所以需要做任何附加参数对指纹图像进行操作?
我看到写了几个代码,其中傅里叶光谱用复共轭分割,如下所示:
af = fftn(double(img1));
bf = fftn(double(img2));
cp = af .* conj(bf) ./ abs(af .* conj(bf));
Run Code Online (Sandbox Code Playgroud)
在这个脚本中.
这与处理复杂的划分有关吗?阅读有关./运算符的文档,声明它处理复杂的数字.这是错的吗?:
af./bf
Run Code Online (Sandbox Code Playgroud) 我试图在不使用matlab内置函数(如fft())的情况下实现一维DFT.这是我的代码
function [Xk] = dft1(xn)
N=length(xn);
n = 0:1:N-1; % row vector for n
k = 0:1:N-1; % row vecor for k
WN = exp(-1j*2*pi/N); % Twiddle factor (w)
nk = n'*k; % creates a N by N matrix of nk values
WNnk = WN .^ nk; % DFT matrix
Xk = (WNnk*xn );
Run Code Online (Sandbox Code Playgroud)
当我使用以下命令后运行代码时:
I = imread('sample.jpg')
R = dft1(I)
Run Code Online (Sandbox Code Playgroud)
我得到这个特殊的错误: 整数类不完全支持使用*MTIMES的错误.至少一个输入必须是标量.要计算元素TIMES,请改用TIMES(.*).
有人可以帮我弄清楚如何解决这个问题
注意:我还在学习Matlab的最初阶段非常感谢你
因此,我想知道如何在Julia中实现STFT,可能使用Hamming窗口。我在互联网上找不到任何东西。
最好的方法是什么?我宁愿不使用Python库,而尽可能使用纯本地Julia。也许这是Juila正在开发的功能...?
谢谢!