我知道一般来说,当阵列比较大时,FFT and multiplication通常比直接convolve操作更快.然而,我正在卷入一个非常长的信号(比如1000万点),响应非常短(比如1000点).在这种情况下,fftconvolve似乎没有多大意义,因为它迫使第二阵列的FFT与第一阵列的大小相同.在这种情况下直接卷积是否更快?
我正在使用FFT从音频文件中提取每个频率分量的幅度.实际上,Audacity中已经有一个名为Plot Spectrum的函数可以帮助解决问题.以3kHz正弦和6kHz正弦组成的音频文件为例,频谱结果如下图所示.你可以看到峰值在3KHz和6kHz,没有额外的频率.
现在我需要实现相同的功能并在Python中绘制类似的结果.我在帮助下接近Audacity结果,rfft但在得到这个结果后仍然有问题需要解决.
相关代码:
import numpy as np
from pylab import plot, show
from scipy.io import wavfile
sample_rate, x = wavfile.read('sine3k6k.wav')
fs = 44100.0
rfft = np.abs(np.fft.rfft(x))
p = 20*np.log10(rfft)
f = np.linspace(0, fs/2, len(p))
plot(f, p)
show()
Run Code Online (Sandbox Code Playgroud)
更新
我将Hanning窗口与整个长度信号相乘(这是正确的吗?)并得到它.裙子的大部分幅度都低于40.
并按照@Mateen Ulhaq的说法将y轴缩放为分贝.结果更接近Audacity one.我可以将低于-90dB的幅度处理得如此之低以至于可以忽略吗?
更新的代码:
fs, x = wavfile.read('input/sine3k6k.wav')
x = x * np.hanning(len(x))
rfft = np.abs(np.fft.rfft(x))
rfft_max = max(rfft)
p = 20*np.log10(rfft/rfft_max)
f = np.linspace(0, fs/2, len(p))
Run Code Online (Sandbox Code Playgroud)
关于赏金
通过上面更新中的代码,我可以用分贝测量频率分量.最高可能值为0dB.但该方法仅适用于特定的音频文件,因为它使用rfft_max此音频.我想像Audacity那样在一个标准规则中测量多个音频文件的频率成分. …
对于FFT函数,我需要以位反转的方式对数组内的元素进行置换或混洗.这是FFT的常见任务,因为两个大小的FFT函数的大多数功能要么以位反转的方式期望或返回它们的数据.
例如,假设数组有256个元素,我想用它的位反转模式交换每个元素.这是两个例子(二进制):
Element 00000001b should be swapped with element 10000000b
Element 00010111b should be swapped with element 11101000b
Run Code Online (Sandbox Code Playgroud)
等等.
任何想法如何快速,更重要:就地?
我已经有一个执行此交换的功能.写一个并不难.由于这是DSP中常见的操作,我觉得有更聪明的方法比我非常简洁的循环更好.
有问题的语言是C,但任何语言都可以.
我想实现一些旨在在beagleboard上运行的图像处理算法.这些算法广泛使用卷积.我正在尝试为2D卷积找到一个好的C实现(可能使用快速傅立叶变换).我还希望算法能够在beagleboard的DSP上运行,因为我听说DSP针对这些类型的操作进行了优化(使用乘法累加指令).
我没有该领域的背景,所以我认为自己实施卷积不是一个好主意(我可能不会像了解其背后的所有数学一样好).我相信DSP的一个很好的C卷积实现存在于某个地方,但我找不到它?
有人可以帮忙吗?
编辑:原来内核很小.其尺寸为2X2或3X3.所以我想我不是在寻找基于FFT的实现.我正在网上搜索卷积来查看它的定义,所以我可以直接实现它(我真的不知道卷积是什么).我发现的所有东西都是乘法积分,我不知道如何用矩阵来做.有人可以给我一段2X2内核案例的代码(或伪代码)吗?
我有一个传递给读者的音频数据:
recorder.read(audioData,0,bufferSize);
Run Code Online (Sandbox Code Playgroud)
实例化如下:
AudioRecord recorder;
short[] audioData;
int bufferSize;
int samplerate = 8000;
//get the buffer size to use with this audio record
bufferSize = AudioRecord.getMinBufferSize(samplerate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT)*3;
//instantiate the AudioRecorder
recorder = new AudioRecord(AudioSource.MIC,samplerate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,bufferSize);
recording = true; //variable to use start or stop recording
audioData = new short [bufferSize]; //short array that pcm data is put into.
Run Code Online (Sandbox Code Playgroud)
我有一个我在网上找到的FFT课程和一个复杂的课程.我已经尝试了两天在线查看,但无法解决如何循环存储的值audioData并将其传递给FFT.
这是我正在使用的FFT类:http: //www.cs.princeton.edu/introcs/97data/FFT.java ,这是一个复杂的类:http://introcs.cs.princeton.edu /java/97data/Complex.java.html
我在NumPy中使用FFT函数进行一些信号处理.我有一个数组signal
,每小时有一个数据点,共有576个数据点.我使用以下代码signal来查看其傅里叶变换.
t = len(signal)
ft = fft(signal,n=t)
mgft=abs(ft)
plot(mgft[0:t/2+1])
Run Code Online (Sandbox Code Playgroud)
我看到两个峰值,但我不确定x轴的单位是什么,即它们如何映射到小时?任何帮助,将不胜感激.
之前,我问过使用FFT和Complex类获取频率wav音频的问题,
在那里,我需要从AudioRecord输入计算FFT值 - >从麦克风,我以某种方式设法获得FFT值...
现在我需要从之前保存的*.wav音频文件中计算FFT值,我将音频保存在我项目'res'文件夹内'raw'文件夹中
我仍然使用相同的FFT类:http://www.cs.princeton.edu/introcs/97data/FFT.java
与它一起使用的复杂类:http://introcs.cs.princeton.edu/java/97data/Complex.java.html
我使用这种方法从我的原始文件中读取音频文件,然后我调用方法calculateFFT来使用它
private static final int RECORDER_BPP = 16;
private static final int RECORDER_SAMPLERATE = 44100;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private void asli(){
int counter = 0;
int data;
InputStream inputStream = getResources().openRawResource(R.raw.b1);
DataInputStream dataInputStream = new DataInputStream(inputStream);
List<Integer> content = new ArrayList<Integer>();
try {
while ((data = dataInputStream.read()) != -1) {
content.add(data);
counter++; }
} …Run Code Online (Sandbox Code Playgroud) 当使用SoundPool音频类时,仅播放较短的音频片段时,它肯定比MediaPlayer具有一些优势。我注意到的两个是SoundPool快很多。MediaPlayer可能会在启动时滞后一些,从一个声音剪辑转到另一个声音剪辑要容易得多,我不必每次都停止,重置和准备。
但是,是否可以像使用MediaPlayer一样,使用可视化器从SoundPool中播放的音频数据中获取实时fft数据?我无法找到涵盖该主题的任何话题,但是偶然的机会我以为我会问,因为似乎应该有可能。该文档说:“ SoundPool库使用MediaPlayer服务将音频解码为原始的16位PCM单声道或立体声流。” 因此,如果我可以引用SoundPool使用的MediaPlayer,那么我想getAudioSessionId()也许可以使用?
我已经尝试将会话ID设置为0以获得输出混合。它没有用,但无论如何我并不是真正想要的理想效果。我做的第一件事之一就是尝试使用加载的SoundPool SoundID代替可视化程序的会话ID,但这也行不通。
我在Python中使用FFT实现了一个问题.我有完全奇怪的结果.好吧,我想打开图像,获取RGB中每个像素的值,然后我需要在它上面使用fft,然后再次转换为图像.
我的步骤:
1)我正在使用Python中的PIL库打开图像
from PIL import Image
im = Image.open("test.png")
Run Code Online (Sandbox Code Playgroud)
2)我得到了像素
pixels = list(im.getdata())
Run Code Online (Sandbox Code Playgroud)
3)我将每个像素分成r,g,b值
for x in range(width):
for y in range(height):
r,g,b = pixels[x*width+y]
red[x][y] = r
green[x][y] = g
blue[x][y] = b
Run Code Online (Sandbox Code Playgroud)
4).我们假设我有一个像素(111,111,111).并在所有红色值上使用fft
red = np.fft.fft(red)
Run Code Online (Sandbox Code Playgroud)
然后:
print (red[0][0], green[0][0], blue[0][0])
Run Code Online (Sandbox Code Playgroud)
我的输出是:
(53866+0j) 111 111
Run Code Online (Sandbox Code Playgroud)
我认为这是完全错误的.我的图像是64x64,而来自gimp的FFT完全不同.实际上,我的FFT只给出了具有巨大值的数组,这就是为什么我的输出图像是黑色的.
你知道问题出在哪里吗?
[编辑]
我按照建议改变了
red= np.fft.fft2(red)
Run Code Online (Sandbox Code Playgroud)
然后我扩展它
scale = 1/(width*height)
red= abs(red* scale)
Run Code Online (Sandbox Code Playgroud)
而且,我只得到黑色图像.
[EDIT2]
假设我不想打开它并保存为灰度图像.所以我这样做.
def getGray(pixel):
r,g,b = pixel
return (r+g+b)/3
im = Image.open("test.png")
im.load()
pixels = list(im.getdata())
width, …Run Code Online (Sandbox Code Playgroud)