我想实时地对音频信号进行FFT,这意味着当人在麦克风讲话时.我将获取数据(我使用portaudio执行此操作,如果使用wavein会更容易,我会乐意使用它 - 如果您可以告诉我如何).接下来我正在使用FFTW库 - 我知道如何执行1D,2D(实数和复数)FFT,但我不太清楚如何做到这一点,因为我必须进行3D FFT以获得频率,幅度(这将决定颜色渐变)和时间.或者它只是一个2D FFT,我得到幅度和频率?
所以我有这个'我'的形象.我用F = fft2(I)得到2D傅里叶变换.为了重建它,我可以去ifft2(F).
问题是,我需要仅从a)幅度和b)F的相位分量重建这个图像.我如何分离傅立叶变换的这两个分量,然后从每个变换重建图像?
我尝试了abs()和angle()函数来获得幅度和相位,但第一阶段将无法正确重建.
救命?
我使用64位matlab和32g RAM(你知道的).
我有一个130万个数字(整数)的文件(向量).我想制作另一个相同长度的矢量,其中每个点是整个第一个矢量的加权平均值,加权距离该位置的反距离(实际上它的位置是^ -0.1,不是^ -1,但是出于示例目的) .我不能使用matlab的'过滤'功能,因为它只能在当前点之前平均事物,对吧?为了更清楚地解释,这里有3个元素的例子
data = [ 2 6 9 ]
weights = [ 1 1/2 1/3; 1/2 1 1/2; 1/3 1/2 1 ]
results=data*weights= [ 8 11.5 12.666 ]
i.e.
8 = 2*1 + 6*1/2 + 9*1/3
11.5 = 2*1/2 + 6*1 + 9*1/2
12.666 = 2*1/3 + 6*1/2 + 9*1
Run Code Online (Sandbox Code Playgroud)
因此,新矢量中的每个点都是整个第一个矢量的加权平均值,加权1 /(距该位置的距离+ 1).
我可以重新制作每个点的权重向量,然后逐个元素计算结果向量,但这需要130万次for循环迭代,每个迭代包含130万次乘法.我宁愿使用直接矩阵乘法,将1x1.3mil乘以1.3milx1.3mil,这在理论上是有效的,但我无法加载大的矩阵.
然后我尝试使用shell脚本制作矩阵并在matlab中对其进行索引,因此一次只调用矩阵的相关列,但这也需要很长时间.
我没有必要在matlab中这样做,所以人们对利用如此大的数字和获得平均值的任何建议将不胜感激.因为我使用的是^ -0.1的重量,而不是^ -1,所以它不会快速下降 - 百万分之一点仍然加权为0.25,而原始点加权为1,所以我不能只是削减它因为它变大了.
希望这很清楚吗?
以下是答案的代码(因此可以格式化?):
data = load('/Users/mmanary/Documents/test/insertion.txt');
data=data.';
total=length(data);
x=1:total;
datapad=[zeros(1,total) data];
weights = ([(total+1):-1:2 1:total]).^(-.4);
weights = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Python来检索实时音频输入的主要频率.目前我正在尝试使用音频流我的笔记本电脑的内置麦克风,但在测试以下代码时,我的结果非常糟糕.
# Read from Mic Input and find the freq's
import pyaudio
import numpy as np
import bge
import wave
chunk = 2048
# use a Blackman window
window = np.blackman(chunk)
# open stream
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 1920
p = pyaudio.PyAudio()
myStream = p.open(format = FORMAT, channels = CHANNELS, rate = RATE, input = True, frames_per_buffer = chunk)
def AnalyseStream(cont):
data = myStream.read(chunk)
# unpack the data and times by the hamming window
indata = …Run Code Online (Sandbox Code Playgroud) 我读过这些问题:
iOS FFT Accerelate.framework在播放期间绘制频谱
它们都描述了如何使用加速框架设置fft.在他们的帮助下,我能够设置fft并获得一个基本的频谱分析仪.现在,我正在显示我从fft获得的所有值.但是,我只想显示10-15或一个可变数量的条形图来确定某些频率.就像iTunes或WinAmp Level Meter一样.1.我是否需要从一系列频率中平均幅度值?或者他们只是向您展示特定频率条的幅度?2.此外,我是否需要将我的幅度值转换为db?3.如何将数据映射到特定范围.我是否映射了我的声音bitdepth的最大db范围?获取bin的最大值将导致跳转最大映射值.
我的RenderCallback:
static OSStatus PlaybackCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
UInt32 maxSamples = kAudioBufferNumFrames;
UInt32 log2n = log2f(maxSamples); //bins
UInt32 n = 1 << log2n;
UInt32 stride = 1;
UInt32 nOver2 = n/2;
COMPLEX_SPLIT A;
float *originalReal, *obtainedReal, *frequencyArray, *window, *in_real;
in_real = (float *) malloc(maxSamples * sizeof(float));
A.realp = (float *) malloc(nOver2 * sizeof(float));
A.imagp = (float *) malloc(nOver2 * sizeof(float));
memset(A.imagp, …Run Code Online (Sandbox Code Playgroud) 我尝试用fft过滤我的数据.我有一个嘈杂的信号记录500Hz作为1d阵列.我的高频应切断20Hz,低频切断10Hz.我试过的是:
fft=scipy.fft(signal)
bp=fft[:]
for i in range(len(bp)):
if not 10<i<20:
bp[i]=0
ibp=scipy.ifft(bp)
Run Code Online (Sandbox Code Playgroud)
我现在得到的是复数.所以一定是错的.什么?我该如何更正我的代码?
我正在Matlab中的傅里叶域中进行模板匹配.这是我的图像(艺术家是DeviantArt上的RamalamaCreatures):
我的目标是在负鼠的耳朵周围放置一个边界框,就像这个例子(我使用normxcorr2执行模板匹配):
这是我正在使用的Matlab代码:
clear all; close all;
template = rgb2gray(imread('possum_ear.jpg'));
background = rgb2gray(imread('possum.jpg'));
%% calculate padding
bx = size(background, 2);
by = size(background, 1);
tx = size(template, 2); % used for bbox placement
ty = size(template, 1);
%% fft
c = real(ifft2(fft2(background) .* fft2(template, by, bx)));
%% find peak correlation
[max_c, imax] = max(abs(c(:)));
[ypeak, xpeak] = find(c == max(c(:)));
figure; surf(c), shading flat; % plot correlation
%% display best match
hFig = figure;
hAx = axes;
position = [xpeak(1)-tx, …Run Code Online (Sandbox Code Playgroud) matlab fft image-processing template-matching cross-correlation
我正在尝试创建一个项目,从互联网上提取实时流音频文件,并连续采样音频,寻找给定时间段内最主要的频率.这个想法是,如果它在一段时间(几秒)内检测到让我们说440Hz的频率,则意味着在直播流上播放了特定的音调.一旦它检测到特定的音调,我就会在程序中做一些其他的事情.直播是流言,单音或沉默.
我能够做到这一点,得到一个概念证明工作,读取我从在线音调发生器生成的文件.当我传入该文件时,它正确地识别频率(它仅关闭1或2 Hz).当我拉入实时流时,我得到的频率数据类似于:17704Hz.我的猜测是它来自直播的"噪音".
我正在使用npm模块node-pitchfinder并audio-analyer完成大部分处理
关于如何获得单音的任何想法?
const fs = require('fs');
const fsa = require('fs-extra');
const Lame = require('lame');
const Speaker = require('speaker');
const Volume = require('pcm-volume');
const Analyser = require('audio-analyser')
const request = require('request')
const Chunker = require('stream-chunker');
const { YIN } = require('node-pitchfinder')
const detectPitch = YIN({ sampleRate: 44100})
//const BUFSIZE = 64;
const BUFSIZE = 500;
var decoder = new Lame.Decoder();
decoder.on('format', function(format){onFormat(format)});
var chunker = Chunker(BUFSIZE);
chunker.pipe(decoder);
var options = {
url: …Run Code Online (Sandbox Code Playgroud) 我一直在试验FFT算法.我使用NAudio以及来自互联网的FFT算法的工作代码.根据我对性能的观察,得到的音高是不准确的.
会发生的事情是我有一个MIDI(由GuitarPro生成)转换为WAV文件(44.1khz,16位,单声道),其中包含从E2(最低吉他音符)到大约E6的音高级数.低音(E2-B3附近)的结果通常是非常错误的.但达到C4有点正确,因为你已经可以看到正确的进展(下一个音符是C#4,然后是D4等)但是,问题在于检测到的音高是低于实际音高的半音(例如,C4应该是音符,但是显示D#4).
您认为可能有什么不对?如有必要,我可以发布代码.非常感谢!我还是开始掌握DSP的领域.
编辑:这是我正在做的粗略划痕
byte[] buffer = new byte[8192];
int bytesRead;
do
{
bytesRead = stream16.Read(buffer, 0, buffer.Length);
} while (bytesRead != 0);
Run Code Online (Sandbox Code Playgroud)
然后:(waveBuffer只是一个将byte []转换为float []的类,因为该函数只接受float [])
public int Read(byte[] buffer, int offset, int bytesRead)
{
int frames = bytesRead / sizeof(float);
float pitch = DetectPitch(waveBuffer.FloatBuffer, frames);
}
Run Code Online (Sandbox Code Playgroud)
最后:( Smbpitchfft是具有FFT算法的类...我相信它没有错,所以我不在这里发布)
private float DetectPitch(float[] buffer, int inFrames)
{
Func<int, int, float> window = HammingWindow;
if (prevBuffer == null)
{
prevBuffer = new float[inFrames]; //only contains zeroes
}
// double frames since …Run Code Online (Sandbox Code Playgroud) 经过研究和大量的试验和错误,我已经到了一个点,我可以构建一个谱图,我认为它具有正确和错误的元素.
1.首先,我将.wav文件读入字节数组并仅提取数据部分.
2.我将字节数组转换为双数组,取左右声道的平均值.我还注意到1个通道的1个样本由2个字节组成.所以,4个字节变为1个双精度.
3.对于某个窗口大小为2的功率,我从这里应用FFT 并得到频域的幅度.这是谱图图像的垂直条带.
4.我使用相同的窗口大小重复执行此操作并重叠整个数据并获得频谱图.
以下是将.wav读入双数组的代码
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
public class readWAV2Array {
private byte[] entireFileData;
//SR = sampling rate
public double getSR(){
ByteBuffer wrapped = ByteBuffer.wrap(Arrays.copyOfRange(entireFileData, 24, 28)); // big-endian by default
double SR = wrapped.order(java.nio.ByteOrder.LITTLE_ENDIAN).getInt();
return SR;
}
public readWAV2Array(String filepath, boolean print_info) throws IOException{
Path path = Paths.get(filepath);
this.entireFileData = Files.readAllBytes(path);
if (print_info){
//extract format
String format = new …Run Code Online (Sandbox Code Playgroud) fft ×10
matlab ×3
python ×2
analysis ×1
average ×1
blender ×1
c ×1
c# ×1
convolution ×1
core-audio ×1
filtering ×1
ios ×1
java ×1
javascript ×1
large-data ×1
node.js ×1
numpy ×1
phase ×1
pitch ×1
real-time ×1
spectrogram ×1
spectrum ×1
vdsp ×1