我正在尝试使用C++进行实时音高检测.我正在测试一些来自Performous(http://performous.org/)的代码,因为其他一切对我来说都不起作用.我确信这有效,但我不能让它发挥作用.我已经尝试了几个星期了,而且我还没有能够得到任何音调检测代码.
我试图通过将其视为一个频谱将图像转换成音频信号在MATLAB 中的Aphex Twin酒店的宋Windowlicker.不幸的是,我无法获得结果.
这就是我现在所拥有的:
function signal = imagetosignal(path, format)
% Read in the image and make it symmetric.
image = imread(path, format);
image = [image; flipud(image)];
[row, column] = size(image);
signal = [];
% Take the ifft of each column of pixels and piece together the real-valued results.
for i = 1 : column
spectrogramWindow = image(:, i);
R = abs(ifft(spectrogramWindow));
% Take only the results for the positive frequencies.
signalWindow = R(1 : row / 2.0);
signal …Run Code Online (Sandbox Code Playgroud) 我想知道数据的频率.我有点想到它可以使用FFT完成,但我不知道该怎么做.一旦我将整个数据传递给FFT,它就会给我2个峰值,但我怎样才能获得频率?
非常感谢提前.
我正在尝试利用Numpy的fft函数,但是当我给函数一个简单的gausian函数时,该gausian函数的fft不是gausian,它的接近但是它的一半使得每一半都在x轴的任一端.
我正在计算的高斯函数是y = exp(-x ^ 2)
这是我的代码:
from cmath import *
from numpy import multiply
from numpy.fft import fft
from pylab import plot, show
""" Basically the standard range() function but with float support """
def frange (min_value, max_value, step):
value = float(min_value)
array = []
while value < float(max_value):
array.append(value)
value += float(step)
return array
N = 256.0 # number of steps
y = []
x = frange(-5, 5, 10/N)
# fill array y with values of the Gaussian …Run Code Online (Sandbox Code Playgroud) 在Matlab中,我经常使用Welch的方法(pwelch)来计算功率谱,然后我将其显示在对数 - 对数图上.估计的频率pwelch是等间隔的,但对数间隔的点更适合于对数 - 对数图.特别是,当将绘图保存为PDF文件时,由于高频率点过多,这会导致文件太大.
从线性间隔频率到对数间隔频率重新采样(重新绑定)频谱的有效方案是什么?或者,有什么方法可以在PDF文件中包含高分辨率光谱而不会产生过大的文件大小?
显而易见的事情就是简单地使用interp1:
rate = 16384; %# sample rate (samples/sec)
nfft = 16384; %# number of points in the fft
[Pxx, f] = pwelch(detrend(data), hanning(nfft), nfft/2, nfft, rate);
f2 = logspace(log10(f(2)), log10(f(end)), 300);
Pxx2 = interp1(f, Pxx, f2);
loglog(f2, sqrt(Pxx2));
Run Code Online (Sandbox Code Playgroud)
然而,这是不希望的,因为它不能节省光谱中的功率.例如,如果两个新频率仓之间存在较大的谱线,则将简单地从得到的对数采样谱中排除.
为了解决这个问题,我们可以插入功率谱的积分:
df = f(2) - f(1);
intPxx = cumsum(Pxx) * df; % integrate
intPxx2 = interp1(f, intPxx, f2); % interpolate
Pxx2 = diff([0 intPxx2]) ./ diff([0 …Run Code Online (Sandbox Code Playgroud) 我有5个录制的wav文件.我想将新传入的录音与这些文件进行比较,并确定它与哪个最相似.
在最终产品中,我需要在Linux上用C++实现它,但现在我在Matlab中进行实验.我很容易看到FFT图.但我不知道如何比较它们.
如何计算两个FFT图的相似度?
编辑:录音中只有语音.实际上,我正在努力确定一些电信公司的应答机的响应.这足以区分两个消息"此刻此人无法联系到"和"此号码不再使用"
我正在尝试在.3gpp音频文件上执行快速傅立叶变换.该文件包含来自手机麦克风的44100kHz的小型5秒录音.
我可以找到的每个Java FFT算法只需要double [],float []或Complex []输入,原因很明显,但是我在一个字节数组中读取音频文件,所以我很困惑我从哪里离开 我唯一能找到的是前一个问题的答案:
Android音频FFT使用audiorecord检索特定频率幅度
但我不确定是否这是正确的程序.任何有见识的人?
它被问了很多,但我仍然坚持在Android上实现FFT类我需要使用FFT处理我的音频数据...
我已经在这里阅读了几乎相同的问题如何使用FFT获取PCM的频率数据 ,这里如何从fft结果获得频率? 还有更多的问题,但即使在我尝试了答案后仍然没有找到答案......
我正在使用的FFT类:http: //www.cs.princeton.edu/introcs/97data/FFT.java
与它一起使用的复杂类:http://introcs.cs.princeton.edu/java/97data/Complex.java.html
这是我的代码
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
public class Latihan extends Activity{
private static final int RECORDER_BPP = 16;
private static final String AUDIO_RECORDER_FILE_EXT_WAV = ".wav";
private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder";
private static final String AUDIO_RECORDER_TEMP_FILE = "record_temp.raw";
private static …Run Code Online (Sandbox Code Playgroud) 我在matlab中使用前向和后向fft实现了一个简单的低通滤波器.它原则上有效,但最小值和最大值与原始值不同.
signal = data;
%% fourier spectrum
% number of elements in fft
NFFT = 1024;
% fft of data
Y = fft(signal,NFFT)/L;
% plot(freq_spectrum)
%% apply filter
fullw = zeros(1, numel(Y));
fullw( 1 : 20 ) = 1;
filteredData = Y.*fullw;
%% invers fft
iY = ifft(filteredData,NFFT);
% amplitude is in abs part
fY = abs(iY);
% use only the length of the original data
fY = fY(1:numel(signal));
filteredSignal = fY * NFFT; % correct maximum
clf; hold on; …Run Code Online (Sandbox Code Playgroud) 我需要执行FFT和逆FFT变换.输入将是double的向量和矩阵.理想情况下,输出应该是std :: complex的数组,但我可以使用double _Complex.
我没有找到任何简单的例子,所有英特尔示例都在没有足够评论的情况下同时做了很多事情.
我只想在C++中使用一个简单的例子,将double的向量(或矩阵)作为输入并输出FFT转换结果(理想情况下使用std :: complex).