Tag: fft

我应该从getFft中看到什么样的输出?

好吧,所以我正在创建一个Android音频可视化应用程序。 问题是,我从getFft()方法得到的东西与google所说的应该产生的东西并不相符。 我一直追溯到C ++的源代码,但我不熟悉C ++或FFT来真正了解正在发生的事情。 我会尽力包含这里所需的一切: (Java)Visualizer.getFft(byte [] fft) /** * Returns a frequency capture of currently playing audio content. The capture is a 8-bit * magnitude FFT. Note that the size of the FFT is half of the specified capture size but both * sides of the spectrum are returned yielding in a number […]

android audioRecord-应用变化的增益

我想将增益应用到我的录音(PCM 16bit)。 为此,我有以下代码: for (int i=0; i<buffer.length/2; i++) { // 16bit sample size short curSample = getShort(buffer[i*2], buffer[i*2+1]); if(rGain != 1){ //apply gain curSample *= rGain; //convert back from short sample that was "gained" to byte data byte[] a = getByteFromShort(curSample); buffer[i*2] = a[0]; buffer[i*2 + 1] = a[1]; } 如果像这样应用(将每个样本乘以分数),我会在播放时停止播放(听起来像老式对讲机)。 是否有一些公式可以改变每个样本的增益因子? 我假设样本范围有一些maxValue和minValue(我猜[-32768,+ 32767])并且在某些公式中使用这些值我可以获得应用于当前样本的变化增益因子。 //编辑:已添加 […]

将音频样本的字节数组更改为频率

首先,我有一个项目来改变WAVE文件的频率,我需要在Java中这样做。 我在java中使用AudioSystem来获取音频数据的字节(不包括文件头)。 现在我得到一个数据字节数组,我想将它从时域更改为频域,在操作频率后,我想将其更改回时域。 这是代码: public byte[] getWAVByte(){ ByteArrayOutputStream out = new ByteArrayOutputStream(); try{ File f = new File(“audio.wav”); AudioInputStream in = AudioSystem.getAudioInputStream(f); int read; byte[] buff = new byte[(int)f.length()]; while ((read = in.read(buff)) > 0) { out.write(buff, 0, read); } out.flush(); byte[] audioBytes = out.toByteArray(); return audioBytes; }catch(Exception e){ e.printStackTrace(); } } 现在我在audioBytes中有一个字节数组,我想在频域中将其更改为另一个字节数组。 我已经读过你可以用傅立叶变换做到这一点,但是我的老师说它真的很复杂而且不在我的项目范围内。 那么有没有其他方法可以做到这一点? […]

使用FFT计算频率时的值错误

我的错频率,我不明白为什么我得到错误的值。因为我按照指令计算后跟stackoverflow。 我使用了来自http://introcs.cs.princeton.edu/java/97data/FFT.java.html的 FFT和http://introcs.cs.princeton.edu/java/97data/Complex.java中的复合体。 HTML audioRec.startRecording(); audioRec.read(bufferByte, 0,bufferSize); for(int i=0;i<bufferSize;i++){ bufferDouble[i]=(double)bufferByte[i]; } Complex[] fftArray = new Complex[bufferSize]; for(int i=0;i<bufferSize;i++){ fftArray[i]=new Complex(bufferDouble[i],0); } FFT.fft(fftArray); double[] magnitude=new double[bufferSize]; for(int i=0;i<bufferSize;i++){ magnitude[i] = Math.sqrt((fftArray[i].re()*fftArray[i].re()) + (fftArray[i].im()*fftArray[i].im())); } double max = 0.0; int index = -1; for(int j=0;j<bufferSize;j++){ if(max < magnitude[j]){ max = magnitude[j]; index = j; } } final […]

非log 2的快速傅里叶变换

我想用Java实现快速傅里叶变换以进行和弦识别,但我并不是真的得到它。 它说样本的数量应该是2的幂,那么对于没有等于2的幂的样本数量的歌曲,我们该怎么办呢? 我也想了解STFT。

FFT实现

我正致力于使用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]; } } } 我还实现了第二和第三个公式的代码,但我得到的结果是不正确的。 我该怎么办 ? 第一个方程的代码是否正确? 编辑 […]

傅里叶变换和傅立叶描述符在Java上提取形状特征

我正在尝试使用傅里叶描述符构建一个简单的系统来识别简单的形状:我在我的程序中使用快速傅里叶变换的这种实现:(链接如下) http://www.wikijava.org/wiki/The_Fast_Fourier_Transform_in_Java_%28part_1%29 fft(double[] inputReal, double[] inputImag, boolean direction) 输入是:真实和图像部分(它本质上是边界参数的x,y坐标),输出是变换的实数和图像数。 问题:我如何使用输出(变换的真实,图像)作为我简单形状的不变描述符? 这就是我的想法: 对于每N个步骤计算R = sqrt( real^2 + imag^2 ) 。 将每个R除以R[1] =归一化因子以使其不变。 问题是我对于稍微不同的图像(例如应用轻微旋转等)获得了非常不同的R值 换句话说 : 我的描述符不是不变的…我认为我在获取R值时出错了。

在matlab和java中的fft

我使用jtransforms库在matlab和java中做了fft,但结果略有不同。 Matlab results: -0.0530528652679544 -0.00775535711930750 + 0.0281791646147104i -0.0304104457750988 – 0.209776156064443i 0.266945753193636 + 0.200338044445226i Jtransforms results: -0.05305448436232618 -0.007755593801247046 + 0.028180024600812384 -0.03041137385657606 -0.20978255812004887 0.26695389998013486 + 0.20034415846373468 结果是不同的还是Matlab只是四舍五入?

Java中的快速傅里叶变换

可能重复: Java中可靠而快速的FFT 我想在java中实现快速傅里叶变换计算。 在java中是否有任何库在傅立叶变换中进行计算,我也想知道java中的音频库。

使用JTransforms库计算FFT的自相关

我正在尝试使用下面的代码计算时间序列中的样本窗口的自相关。 我正在对该窗口应用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] = […]