2012-06-05 2 views
0

320 개의 샘플을 포함하는 패킷으로 PCM 데이터 저수지 소켓 연결을 수신하고 있습니다. 샘플링 속도는 초당 8000 샘플입니다. 나는 이런 식으로 뭔가를하고있는 중이 야 : 그 후kiss_fftr의 KissFFT 출력

int size = 160 * 2;//160; 
int isinverse = 1; 
kiss_fft_scalar zero; 
memset(&zero,0,sizeof(zero)); 
kiss_fft_cpx fft_in[size]; 
kiss_fft_cpx fft_out[size]; 
kiss_fft_cpx fft_reconstructed[size]; 

kiss_fftr_cfg fft = kiss_fftr_alloc(size*2 ,0 ,0,0); 
kiss_fftr_cfg ifft = kiss_fftr_alloc(size*2,isinverse,0,0); 

for (int i = 0; i < size; i++) { 
    fft_in[i].r = zero; 
    fft_in[i].i = zero; 
    fft_out[i].r = zero; 
    fft_out[i].i = zero; 
    fft_reconstructed[i].r = zero; 
    fft_reconstructed[i].i = zero; 
} 

// got my data through socket connection 

for (int i = 0; i < size; i++) { 
    // samples are type of short 
    fft_in[i].r = samples[i]; 
    fft_in[i].i = zero; 
    fft_out[i].r = zero; 
    fft_out[i].i = zero; 
} 

kiss_fftr(fft, (kiss_fft_scalar*) fft_in, fft_out); 
kiss_fftri(ifft, fft_out, (kiss_fft_scalar*)fft_reconstructed); 

// lets normalize samples 
for (int i = 0; i < size; i++) { 
    short* samples = (short*) bufTmp1; 
    samples[i] = rint(fft_reconstructed[i].r/(size*2)); 
} 

내가 OpenAL에 버퍼를 작성하고 그들을 재생할 수 있습니다. 모든 것은 잘 작동하지만 오디오의 필터링을 kiss_fftrkiss_fftri 사이에서하고 싶습니다. 내가 생각하기에 시작 지점은 시간 영역에서 주파수 영역으로 사운드를 변환하는 것이지만 실제로는 kiss_fftr 함수에서받은 데이터의 종류를 이해하지 못합니다. 그 복소수 각각에 어떤 정보가 저장되어 있는지, 그 실재와 허수 부가 주파수에 대해 무엇을 말해 줄 수 있는지. 그리고 어느 주파수가 어떤 주파수에 해당하는지 fft_out에 어떤 주파수 범위 (어떤 주파수 범위)가 포함되어 있는지 알 수 없습니다.

전 신호 처리 및 푸리에 변환 주제에있어 초보자입니다.

어떤 도움이 필요합니까?

+1

이것은 논쟁 거리가 아닙니다. 예를 들어 http://dsp.stackexchange.com. 하지만 실제로 DSP에 대한 입문서 (예 : [this] (http://www.amazon.co.uk/Understanding-Digital-Signal-Processing-Richard/dp/0137027419/))를 얻는 것이 좋습니다. 이것은 StackOverflow 스타일의 답변으로 적절하게 다루기에는 너무 큰 주제입니다. –

답변

1

중복 추가 또는 중복 저장 알고리즘을 사용하여 FFT 빠른 회선을 조사하는 것이 좋습니다. 원하는 필터의 임펄스 길이만큼 각 FFT의 길이를 확장해야합니다. 이는 (1) FFT/IFFT 컨볼 루션이 원형이고 (2) FFT 배열 결과의 각 인덱스가 거의 모든 주파수 (Sinc 모양의 응답)에 해당하기 때문입니다. 빈 수정은 전체 주파수 응답에서 누출 될 것입니다 (특정 정확한주기 주파수는 제외).

2

두 발로 C 코드로 실행하기 전에 디지털 필터 인 esp FIR filters에 익숙해 지십시오.

GNU Octave's 신호 도구 상자를 사용하여 FIR 필터를 설계 할 수 있습니다. fir1 (가장 간단한 것), firls 또는 remez 명령을보십시오. 또는 웹 페이지를 통해 FIR 필터를 설계 할 수 있습니다. "온라인 전나무 필터 디자인"에 대한 빠른 웹 검색 결과는 this입니다. 사용하지는 않았지만 remez 또는 firpm 명령에 사용 된 등음 설계를 사용하는 것으로 보입니다.

먼저 직접 컨볼 루션을 사용하여 필터를 구현하십시오 (FFT가없는 경우) 속도가 수용 가능한지 확인하십시오. 이것은 더 쉬운 경로입니다. FFT 기반 접근 방식이 필요한 경우 kissfft/tools/kiss_fastfir.c 파일에 overlap-save의 샘플 구현이 있습니다.

1

귀하의 질문에 직접 답변하려고 노력합니다.

// a) the real and imaginary components of the output need to be combined to calculate the amplitude at each frequency. 

float ar,ai,scaling; 

scaling=1.0/(float)size; 

// then for each output [i] from the FFT... 

ar = fft_out[i].r; 
ai = fft_out[i].i; 
amplitude[i] = 2.0 * sqrtf(ar*ar + ai*ai) * scaling ; 

// b) which index refers to which frequency? This can be calculated as follows. Only the first half of the FFT results are needed (assuming your 8KHz sampling rate) 

for(i=1;i<(size/2);i++) freq = (float)i/(1/8000)/(float)size ; 

// c) phase (range +/- PI) for each frequency is calculated like this: 

phase[i] = phase = atan2(fft_out[i].i/fft_out[i].r); 
+0

위대한 설명, 나는 2 개의 질문이 있습니다. 1) 단계가 무엇인지 더 자세히 설명 할 수 있습니까? b)에서 i = 1 일 때 freq = 25; i = 2는 50입니다. Bin1은 [0,25] hz이고 bin2는 [26,50] hz입니까? 거기에 단계가 오나요? 2) 주파수의 나머지 절반은 어떻게됩니까? 우리가 8Khz에서 샘플링하면, i = max (160)에서 우리는 단지 4000hz입니다. 4400hz +는 어떨까요? 쓰레기통에 8000hz의 산란이 있어야합니까? – Lazik

+0

"Nyquist-Shannon Sampling Theorem은 샘플링 속도가 샘플링되는 신호의 최대 주파수의 두 배 이상일 때 신호를 재구성 할 수 있다고 말합니다.이 규칙은 인간이 20,000 헤르츠 초당 최소 40,001 개의 샘플 "http://daugroupassignment.wikia.com/wiki/Nyquist-Shannon_Sampling_Theorem – kevinf