标签: fft

Python SciPy卷积与fftconvolve

我知道一般来说,当阵列比较大时,FFT and multiplication通常比直接convolve操作更快.然而,我正在卷入一个非常长的信号(比如1000万点),响应非常短(比如1000点).在这种情况下,fftconvolve似乎没有多大意义,因为它迫使第二阵列的FFT与第一阵列的大小相同.在这种情况下直接卷积是否更快?

python fft convolution scipy

8
推荐指数
3
解决办法
7505
查看次数

将FFT频谱幅度归一化为0dB

我正在使用FFT从音频文件中提取每个频率分量的幅度.实际上,Audacity中已经有一个名为Plot Spectrum的函数可以帮助解决问题.以3kHz正弦和6kHz正弦组成的音频文件为例,频谱结果如下图所示.你可以看到峰值在3KHz和6kHz,没有额外的频率.

在此输入图像描述

现在我需要实现相同的功能并在Python中绘制类似的结果.我在帮助下接近Audacity结果,rfft但在得到这个结果后仍然有问题需要解决.

在此输入图像描述

  1. 第二张图中振幅的物理意义是什么?
  2. 如何将幅度标准化为0dB,就像Audacity中的那样?
  3. 为什么6kHz以上的频率具有如此高的幅度(≥90)?我可以将这些频率调整到相对较低的水平吗?

相关代码:

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那样在一个标准规则中测量多个音频文件的频率成分. …

python fft frequency audacity spectrum

8
推荐指数
1
解决办法
1256
查看次数

阵列上的就地位反转shuffle

对于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,但任何语言都可以.

c signal-processing fft

7
推荐指数
3
解决办法
6247
查看次数

用于DSP的快速2D卷积

我想实现一些旨在在beagleboard上运行的图像处理算法.这些算法广泛使用卷积.我正在尝试为2D卷积找到一个好的C实现(可能使用快速傅立叶变换).我还希望算法能够在beagleboard的DSP上运行,因为我听说DSP针对这些类型的操作进行了优化(使用乘法累加指令).

我没有该领域的背景,所以我认为自己实施卷积不是一个好主意(我可能不会像了解其背后的所有数学一样好).我相信DSP的一个很好的C卷积实现存在于某个地方,但我找不到它?

有人可以帮忙吗?

编辑:原来内核很小.其尺寸为2X2或3X3.所以我想我不是在寻找基于FFT的实现.我正在网上搜索卷积来查看它的定义,所以我可以直接实现它(我真的不知道卷积是什么).我发现的所有东西都是乘法积分,我不知道如何用矩阵来做.有人可以给我一段2X2内核案例的代码(或伪代码)吗?

c signal-processing fft convolution beagleboard

7
推荐指数
1
解决办法
2万
查看次数

在ios上的录音和波形图画

我正在使用AVAudioRecorder录制音频,录制后我想绘制录制音频的波形.我发现了一篇关于波形绘制好文章,但首先我需要以特定采样率的频率作为浮点数,对吗?

我是否需要对音频进行FFT以及如何进行此操作?*AVAudioRecorder**甚至是用于此目的的API吗?或者我是否需要使用较低的API来录制音频?希望可以有人帮帮我.

iphone waveform fft avaudiorecorder ios

7
推荐指数
1
解决办法
3397
查看次数

如何使用FFT从PCM获取频率数据

我有一个传递给读者的音频数据:

 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

java android fft pcm

7
推荐指数
1
解决办法
7329
查看次数

在NumPy中使用FFT时的频率单位

我在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轴的单位是什么,即它们如何映射到小时?任何帮助,将不胜感激.

signal-processing numpy fft

7
推荐指数
1
解决办法
9627
查看次数

从音频文件计算FFT

之前,我问过使用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)

java audio fft audiotrack

7
推荐指数
1
解决办法
2万
查看次数

可以在SoundPool对象上使用Android Visualizer类吗?

当使用SoundPool音频类时,仅播放较短的音频片段时,它肯定比MediaPlayer具有一些优势。我注意到的两个是SoundPool快很多。MediaPlayer可能会在启动时滞后一些,从一个声音剪辑转到另一个声音剪辑要容易得多,我不必每次都停止,重置和准备。

但是,是否可以像使用MediaPlayer一样,使用可视化器从SoundPool中播放的音频数据中获取实时fft数据?我无法找到涵盖该主题的任何话题,但是偶然的机会我以为我会问,因为似乎应该有可能。该文档说:“ SoundPool库使用MediaPlayer服务将音频解码为原始的16位PCM单声道或立体声流。” 因此,如果我可以引用SoundPool使用的MediaPlayer,那么我想getAudioSessionId()也许可以使用?

我已经尝试将会话ID设置为0以获得输出混合。它没有用,但无论如何我并不是真正想要的理想效果。我做的第一件事之一就是尝试使用加载的SoundPool SoundID代替可视化程序的会话ID,但这也行不通。

android fft sessionid visualizer soundpool

7
推荐指数
0
解决办法
205
查看次数

使用Python在图像上进行FFT

我在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]

好的,让我们拍一张照片. test.png

假设我不想打开它并保存为灰度图像.所以我这样做.

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)

python image fft dft

7
推荐指数
2
解决办法
2万
查看次数