我试图通过将其视为一个频谱将图像转换成音频信号在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个峰值,但我怎样才能获得频率?
非常感谢提前.
我一直在iphone上进行简单的频率检测设置.在存在谐波的情况下,使用FFT结果在频域中进行分析有些不可靠.我希望使用倒谱结果来帮助确定正在播放的基本频率.
我正在使用AudioToolbox框架中的AudioQueues,并使用Accelerate框架进行傅立叶变换.
我的过程正是维基百科的Cepstrum文章中列出的Real Power Cepstrum,具体为:信号→FT→abs()→square→log→FT→abs()→square→power倒谱.
我遇到的问题是倒谱结果非常嘈杂.我必须删除第一个和最后20个值,因为它们与其他值相比是天文数字.即使在"清理"数据之后,仍然存在大量的变化 - 远远超过我对第一张图的预期.有关频域和quefrency域的可视化,请参见下面的图片.
FFT
倒谱
当我在频域中看到如此明显的赢家时,我希望在quefrency域中看到类似的清晰结果.我玩了A440,并希望bin 82左右的音量最高.图表上的第三个峰值代表bin 79,它足够接近.正如我所说,前20个左右垃圾桶在幅度如此天文数字的是unusuable,我不得不从数据集中删除他们为了看到什么.倒谱数据的另一个奇怪的质量是偶数箱似乎远远高于奇数箱.以下是77-86的频率分档:
77: 151150.0313
78: 22385.92773
79: 298753.1875
80: 56532.72656
81: 114177.4766
82: 31222.88281
83: 4620.785156
84: 13382.5332
85: 83.668259
86: 1205.023193
Run Code Online (Sandbox Code Playgroud)
我的问题是如何清理频域,以便我的Cepstrum域结果不那么疯狂.或者,帮助我更好地理解如何解释这些结果,如果它们正如人们在倒谱分析中所期望的那样.我可以发布我正在使用的代码的示例,但它主要使用vDSP调用,我不知道它会有多大帮助.
在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图的相似度?
编辑:录音中只有语音.实际上,我正在努力确定一些电信公司的应答机的响应.这足以区分两个消息"此刻此人无法联系到"和"此号码不再使用"
我正在使用Android 2.3.1上的Visualizer类进行一些音乐分析.我发现FFT和波形幅度受设备体积的影响.这意味着如果用户关闭了音量,我会收到很少或没有FFT数据.
我在摩托罗拉Xoom,三星Galaxy Tab和模拟器上进行了测试,它就是这样的.
我使用下面的代码:
mp = new MediaPlayer();
mp.setDataSource("/sdcard/sine1.wav");
mp.prepare();
mp.setLooping(true);
mp.start();
int audioSessionID = mp.getAudioSessionId();
v = new Visualizer(audioSessionID);
v.setEnabled(true);
Run Code Online (Sandbox Code Playgroud)
看一下Visualizer类的文档,似乎如果我们传入一个有效的音频会话id,那么可视化器应该在这个音频会话上运行.Visualizer似乎在输出组合上运行.
有没有其他人遇到这个或找到了解决方法?
谢谢
我知道有很多关于均衡器的问题,但是我没有得到我想要的东西.我想要做的是一个均衡器,用于修改音频样本,如:
equalizer.eqAudio(audiosamples, band, gain)
Run Code Online (Sandbox Code Playgroud)
我不确定这是否是我想要的确切接口,因为我在实现它们方面对DSP知之甚少(我使用过滤器,限制器,压缩器但没有制造它们).
所以谷歌搜索我读到我必须对样本进行FFT,这样我得到每个频率范围的数据而不是幅度,按照我想要的方式处理它,然后进行FFT的反转,这样我再次得到音频样本的结果.我寻找了这个FFT的实现,并找到了JTransform for Java.该库具有称为离散余弦变换(DCT)的FFT相关算法的实现.
我的问题是:
谢谢!
嗨,我是音频相关编码的菜鸟,我正在使用音调跟踪DLL,我将尝试创建一种开源版本的视频游戏Rocksmith作为学习体验.
到目前为止,我已经设法使FFT工作,所以我可以通过使用算法检测音高频率(Hz),下表我可以设法确定八度音程(第2到第6)和音符(C到B)打了便条.
下一步是检测字符串,以便我可以确定音品.

我一直在考虑它,理论上我可以使用它,我会知道用户何时正在播放正确的音符,但游戏可能是"黑客",因为只使用Hz,游戏无法检测到音符以正确的字符串播放.例如,第5弦+第1音品= C4 261.63Hz等于第6弦+第5音品= C4 261.63Hz.
让用户在错误的字符串中播放音符并将其设置为正确的可能性很低,但我认为知道该字符串真的很好,所以当他们播放错误的字符串时我可以向用户提供一些错误反馈(如你应该上弦或下线).
你知道我能做些什么来检测字符串吗?提前致谢 :)
[编辑]
我们使用的吉他和琴弦会影响音色,因此分析音色似乎不是检测琴弦的简单方法:
"吉他音色的变化是由拾音器的设计和位置,吉他的自然共振和阻尼产生的,因为使用的木材(这是一种不同的木材!)及其结构和形状,你的琴弦的规格和年龄,你的演奏技巧,你烦恼和拔弦的地方,等等."
无论我如何更改数据,通过以下代码绘制的图形只是ZERO周围的峰值.我的数据只是一列,记录了某种信号的每个时间点.是time_step一个值,我应该根据两个相邻点在我的数据的时间间隔定义?
data=np.loadtxt("timesequence",delimiter=",",usecols=(0,),unpack=True)
ps = np.abs(np.fft.fft(data))**2
time_step = 1
freqs = np.fft.fftfreq(data.size, time_step)
idx = np.argsort(freqs)
pl.plot(freqs[idx], ps[idx])
pl.show()
Run Code Online (Sandbox Code Playgroud) 显然,rfft2函数只是计算输入矩阵的离散fft.但是,如何解释给定的输出索引?给定一个输出指数,我看哪个傅立叶系数?
我对输出的大小感到特别困惑.对于n×n矩阵,输出似乎是n乘(n/2)+1矩阵(对于偶数n).为什么方阵最终会得到非方形傅立叶变换?