我有一个文件阅读器,从文件中读取n个字节,并返回表示该(二进制)数据的字符串.我想将n个字节读入一个数字的numpy数组并在其上运行FFT,但是我在从字符串创建数组时遇到了麻烦.几行例子会很棒.
编辑:
我正在读取原始二进制数据,所以我得到的字符串看起来像'\x01\x05\x03\xff'....我希望这成为[1, 5, 3, 255].
简短而简单:大家 都非常简单......我只想知道从FFT中获取MFCC所涉及的步骤.
详细:
大家好.我正在进行鼓声应用,我想对声音进行分类.它只是一个匹配的应用程序,它返回您在鼓上播放的音符的名称.
它是一个简单的印度大声鼓.那里只有几个可以玩的音符.
我已经实现了fft算法并成功获得了一个频谱.我现在想更进一步,从fft返回mfcc.
这是我到目前为止所理解的.它基于非线性梅尔频率范围上对数功率谱的线性余弦变换.
它使用三角测量滤除频率并获得所需的系数. http://instruct1.cit.cornell.edu/courses/ece576/FinalProjects/f2008/pae26_jsc59/pae26_jsc59/images/melfilt.png
因此,如果您从fft算法返回大约1000个值 - 声音的频谱,那么理想的是您将获得大约12个元素(即系数).这个12元素的矢量用于对乐器进行分类,包括演奏的鼓......
这正是我想要的.
有人可以帮我解决如何做这样的事情吗?我的编程技巧没问题.我目前正在为iphone创建一个应用程序.用openframeworks.
任何帮助将不胜感激.干杯
我正在尝试开发一个简单的C应用程序,它可以在WAV文件中的给定时间戳下在特定频率范围内给出0-100的值.
示例:我的频率范围为44.1kHz(典型的MP3文件),我想将该范围分成n个范围(从0开始).然后我需要得到每个范围的幅度,从0到100.
到目前为止我管理的内容:
使用libsndfile我现在能够读取WAV文件的数据.
infile = sf_open(argv [1], SFM_READ, &sfinfo);
float samples[sfinfo.frames];
sf_read_float(infile, samples, 1);
Run Code Online (Sandbox Code Playgroud)
但是,我对FFT的理解相当有限.但我知道为了使振幅达到我需要的范围是必需的.但是我该如何继续前进呢?我找到了FFTW-3库,它似乎适用于此目的.
我在这里找到了一些帮助:https://stackoverflow.com/a/4371627/1141483
并在这里查看了FFTW教程:http://www.fftw.org/fftw2_doc/fftw_2.html
但由于我不确定FFTW的行为,我不知道从这里开始.
另一个问题,假设您使用libsndfile:如果强制读取单引导(使用立体声文件)然后读取样本.那么你真的只会阅读总文件的一半样本吗?其中一半来自频道1,还是自动过滤出来?
非常感谢您的帮助.
编辑:我的代码可以在这里看到:
double blackman_harris(int n, int N){
double a0, a1, a2, a3, seg1, seg2, seg3, w_n;
a0 = 0.35875;
a1 = 0.48829;
a2 = 0.14128;
a3 = 0.01168;
seg1 = a1 * (double) cos( ((double) 2 * (double) M_PI * (double) n) / ((double) N - (double) 1) );
seg2 = a2 * (double) cos( …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用下面的代码计算时间序列中的样本窗口的自相关.我正在对该窗口应用FFT,然后计算实部和虚部的大小并将虚部设置为零,最后对其进行逆变换以获得自相关:
DoubleFFT_1D fft = new DoubleFFT_1D(magCnt);
fft.realForward(magFFT);
magFFT[0] = (magFFT[0] * magFFT[0]);
for (int i = 1; i < (magCnt - (magCnt%2)) / 2; i++) {
magFFT[2*i] = magFFT[2*i] * magFFT[2*i] + magFFT[2*i + 1] * magFFT[2*i + 1];
magFFT[2*i + 1] = 0.0;
}
if (magCnt % 2 == 0) {
magFFT[1] = (magFFT[1] * magFFT[1]);
} else {
magFFT[magCnt/2] = (magFFT[magCnt-1] * magFFT[magCnt-1] + magFFT[1] * magFFT[1]);
}
autocorr = new double[magCnt];
System.arraycopy(magFFT, 0, autocorr, 0, magCnt);
DoubleFFT_1D …Run Code Online (Sandbox Code Playgroud) 我知道你要做的第一件事是"在文档中寻找它",问题是文档不清楚它.
我使用该库来获取FFT,我从这个简短的指南开始:http: //www.digiphd.com/android-java-reconstruction-fast-fourier-transform-real-signal-libgdx-fft/
问题是它使用:
fft.forward(array);
fft_cpx=fft.getSpectrum();
tmpi = fft.getImaginaryPart();
tmpr = fft.getRealPart();
Run Code Online (Sandbox Code Playgroud)
"fft_cpx","tmpi","tmpr"都是浮点矢量.虽然"tmpi"和"tmpr"用于计算幅度,但"fft_cpx"不再使用.
我认为getSpectrum()是getReal和getImmaginary的联合,但值都是不同的.也许getSpectrum是复杂的价值观,但它们的代表性是什么?
我尝试没有这个行代码fft_cpx=fft.getSpectrum();,它似乎工作正常,但我想知道是否有必要和getSpectrum()和getReal()或getImmaginary()之间的区别.
这是文档:http: //libgdx-android.com/docs/api/com/badlogic/gdx/audio/analysis/FFT.html
public float [] getSpectrum()
返回:最后一个FourierTransform.forward()调用的频谱.
public float [] getRealPart()
返回:最后一个FourierTransform.forward()调用的实部.
public float [] getImaginaryPart()
返回:最后一个FourierTransform.forward()调用的虚部.
谢谢!
我正在构建一个应该在服务器上运行并分析声音文件的工具.我想在Ruby中这样做,因为我的所有其他工具也都是用Ruby编写的.但我找不到一个完成这个的好方法.
我发现的很多例子都是可视化器和图形化的东西.我只需要FFT数据,仅此而已.我需要获取音频数据,并对其进行FFT.我的最终目标是计算一些东西,如平均值/中位数/模式,第25百分位数和第75百分位数,所有频率(加权幅度),BPM,以及可能还有一些其他好的特性,以便以后能够将类似的声音聚集在一起.
首先我尝试使用ruby-audio和fftw3,但我从来没有让两者真正合作.文档也不好,所以我真的不知道什么数据被洗牌.接下来,我试图用bplay/BREC和限制我的Ruby脚本只使用STDIN和对(仍然使用fftw3)执行FFT.但我无法让bplay/brec工作,因为服务器没有声卡,我没有设法直接将音频直接发送到STDOUT,而无需先进入音频设备.
这是我得到的最接近的:
# extracting audio from wav with ruby-audio
buf = RubyAudio::Buffer.float(1024)
RubyAudio::Sound.open(fname) do |snd|
while snd.read(buf) != 0
# ???
end
end
# performing FFT on audio
def get_fft(input, window_size)
data = input.read(window_size).unpack("s*")
na = NArray.to_na(data)
fft = FFTW3.fft(na).to_a[0, window_size/2]
return fft
end
Run Code Online (Sandbox Code Playgroud)
所以现在我陷入困境,无法在Google上找到更好的结果.那么也许你们这些家伙可以帮助我吗?
谢谢!
在测试期间,我注意到一些奇怪的事
我正在对很多向量进行FFT,并且有时会出现numpy FFT函数崩溃的情况.
我简要地调试了这一点,发现一些矢量长度触发了这种行为.
通过事件,我保持一个脚本运行,令我惊讶的是,它没有崩溃,只是花了一点时间.
有没有人知道发生了什么,以及如何反击这一点.我已经看到了许多不同的FFT大小,下面只是一个例子.
import numpy as np
import time
a = np.zeros(166400)
start = time.time()
audio_fft = np.fft.fft(a,len(a))
print "it took %fs"%(time.time() -start)
a = np.zeros(165039)
start = time.time()
audio_fft = np.fft.fft(a,len(a))
print "it took %fs"%(time.time() -start)
a = np.zeros(165038)
start = time.time()
audio_fft = np.fft.fft(a,len(a))
print "it took %fs"%(time.time() -start)
a = np.zeros(165036)
start = time.time()
audio_fft = np.fft.fft(a,len(a))
print "it took %fs"%(time.time() -start)
a = np.zeros(165035)
start = time.time()
audio_fft = np.fft.fft(a,len(a))
print "it took …Run Code Online (Sandbox Code Playgroud) 我试图找到一种方法来比较使用不同仪器上播放的相同音符的MATLAB短500毫秒录音的相似度.
详细介绍这个特定主题:我是一名音乐专业学生,其任务是客观地确定各种现代低铜乐器的音调,以确定哪种乐器应该取代过时的"ophicleide"或Bass keyed bugle.我首先使用它的光谱仪和其他6种仪器的视觉比较,但这种方法过于主观.
我用相同的麦克风,设备,增益级别和相同的音符录制了所有乐器.出于这个原因,我相信信号足够类似于使用MATLAB工具.
我认为比较这fft将是最准确的计算.我首先尝试了一个频域相关,并测试了相同音调的不同段(eu并且eu2是变量)
>> corr(abs(fft(eu)),abs(fft(eu2)))
ans = 0.9963
Run Code Online (Sandbox Code Playgroud)
这是朝着正确方向迈出的一步,但是当我比较不同的信号时,我似乎得到了相反的结果:(次中音和ophicleide声音几乎相同)
>> corr(abs(fft(eu)),abs(fft(ophi)))
ans = 0.5242
Run Code Online (Sandbox Code Playgroud)
次中音和低音单簧管声音完全不同,但这表明相关性较高
>> corr(abs(fft(eu)),abs(fft(basscl)))
ans = 0.8506
Run Code Online (Sandbox Code Playgroud)
我尝试了在网上找到的归一化最大互相关幅度公式,但我得到了相同的结果
>> norm_max_xcorr_mag = @(x,y)(max(abs(xcorr(x,y)))/(norm(x,2)*norm(y,2))); x =eu2; y = eu; norm_max_xcorr_mag(x,y)
ans = 0.9638
Run Code Online (Sandbox Code Playgroud)
比较其他样本时,我得到了类似的结果
>> norm_max_xcorr_mag = @(x,y)(max(abs(xcorr(x,y)))/(norm(x,2)*norm(y,2))); x = eu; y = basscl;
ans = 0.6825
Run Code Online (Sandbox Code Playgroud)
相比
>> norm_max_xcorr_mag = @(x,y)(max(abs(xcorr(x,y)))/(norm(x,2)*norm(y,2))); x = eu; y = ophi; norm_max_xcorr_mag(x,y)
ans = 0.3519
Run Code Online (Sandbox Code Playgroud)
Euphonium和Bass单簧管(basscl)具有完全不同的声音和完全不同的谐波系列,但这些公式显示出比次谐波和Ophicleide更接近的相关性,其频带看起来几乎完全相同.
我担心这些相关性显示真实音高的相关性(我在所有这些乐器上播放相同的音符,但是Ophicleide可能会失调高达1 Hz)它也可能是相位,甚至是总振幅.
在比较这些复杂波形的谐波泛音的比例时,有没有人知道更好的明确方法?
还是我吠叫错了树?
很难找到fftMatlab使用的在线示例,正确地规范化幅度/功率值.如果您要在不同长度的不同信号上比较这些值,这一点至关重要.这通常是实值输入的问题,因为在这种情况下通常会提取单侧频谱,因此在计算幅度或功率值时应手动应用幅度变化.你可以在这里找到关于GitHub的要点(请告诉我任何错误).
带回家的消息是:
Y = fft(X)/L);Y = fft(y,NFFT)/L),那么规范器是Y = fft(y,NFFT)/L;和不是Y = fft(y,NFFT),我的问题类似于,但比这篇文章更为通用,我认为关于规范化存在错误,最新版本的Matlab(2015)无论如何.我对在CodeReview SE上发布此内容犹豫不决,如果您认为更合适,请在评论中告诉我.
我想用Matlab 来验证以下傅立叶变换代码MX=2*abs(Y);,因为我在网上找到了相互矛盾的信息来源,包括Matlab帮助本身,我无法用某些这样的"食谱"来验证Parseval定理(包括来自MathWorks团队的答案,见下文),特别是那些提取实际输入的单面光谱的答案.
例如,在提取正频率时,通常在网上发现的用于解释实值信号的对称频谱的幅度加倍似乎是错误的(Parseval定理失败),而似乎有必要使用平方根Matlab中的两个系数(我不知道为什么).有些人似乎也直接将DFT系数标准化MX=2*abs(Y)/NFFT;,但我认为这是令人困惑的,应该不鼓励; 幅度定义为复数DFT系数的模数除以信号长度,系数本身不应该被划分.一旦经过验证,我打算将此代码作为GitHub上的要点发布.
function [frq,amp,phi] = fourier_transform( time, vals )
% FOURIER_TRANSFORM computes the Fast Fourier Transform of a given time-series.
%
% [freq,amp,phi] = fourier_transform(time,vals)
%
% Inputs: …Run Code Online (Sandbox Code Playgroud) 我试图估计ECG信号的心率变异性的PSD.为了测试我的代码,我从幻想曲心电图数据库中提取了RR间隔.我提取的信号可以在这里访问.要计算PSD,我使用的是welch方法,如下所示:
import matplotlib.pyplot as plt
import numpy as np
from scipy.signal import welch
ibi_signal = np.loadtxt('fantasia-f1y01-RR.txt')
t = np.array(ibi_signal[:, 0]) # time index in seconds
ibi = np.array(ibi_signal[:, 1]) # the IBI in seconds
# Convert the IBI in milliseconds
ibi = ibi * 1000
# Calculate the welch estimate
Fxx, Pxx = welch(ibi, fs=4.0, window='hanning', nperseg=256, noverlap=128)
Run Code Online (Sandbox Code Playgroud)
接下来,计算曲线下面积以估计不同HRV频带的功率谱,如下所示
ulf = 0.003
vlf = 0.04
lf = 0.15
hf = 0.4
Fs = 250
# find …Run Code Online (Sandbox Code Playgroud)