그래서 신호의 주파수 응답을 0으로 채우고 역 변환하는 주파수 영역 보간기를 작성하려고합니다. 처리해야 할 두 가지 경우가 있습니다.
- 짝수 길이 응답 bin이 모호하므로 분할해야 합니다. 따라서 스펙트럼의 음수 부분을 복사하고 그 사이 에 0을 추가 합니다.
n*(interp-1)-1
- 홀수 길이 응답 bin이 없으므로 양수 / 음수 주파수를 분리 하고 그 사이에 0을 삽입하십시오 .
n*(interp-1)
// Copy negative frequency components to end of buffer and zero out middle
// inp - input buffer of complex floats
// n - transform size
// interp - interpolation amount
void zero_pad_freq(cfloat_t *inp, size_t n, size_t interp) {
if ((n % 2) == 0) {
memmove(inp + n*interp - n/2, inp + n/2, n/2*sizeof(cfloat_t));
memset (inp + n/2 + 1, 0, (n*(interp-1)-1)*sizeof(cfloat_t)); // Duplicate Fs/2 so we need one less zero
inp[n/2] /= 2.0;
inp[n*interp-n/2] /= 2.0;
} else {
memmove(inp + n*interp - n/2, inp + (n+1)/2, n/2*sizeof(cfloat_t));
memset (inp + (n+1)/2, 0, (n*(interp-1))*sizeof(cfloat_t));
}
}
첫 번째 경우는 잘 작동하고 처프 신호로 테스트하고 있으며 보간하는 것은 약간의 숫자 노이즈가 있지만 FFT를 통해 라운드 트립되므로 수행 할 수있는 작업 (처음 정도) 신호 쇼) :
문제는 홀수 길이 변환과 관련이 있습니다. 실제 샘플에서만 매우 심한 과도 응답을 얻습니다 ( 다시 , 실제).
가상 채널에는 작은 잔물결이 있지만 거의 나쁘지는 않습니다.
내가 망친 것 같아 홀수 경우 빈,하지만이없는 나는 매우 의아해하고있어, 그래서 빈은. 누구든지 생각이 있습니까?
줄거리가 줄어든 줄거리는보기가 어렵습니다.
—
Jason R
@Jason 죄송합니다. 링크되어 있다고 생각했습니다. 이제 HTML을 조정하여 클릭하면 전체 크기로 볼 수 있습니다.
—
gct
입력으로 사용중인 코드 나 예제 파일이 있습니까? 명심해야 할 것은 DFT에서 가정 한 경계 조건입니다. 특히, 관심 신호가 주기적이라는 고유의 가정이 있습니다. 따라서 홀수 길이 입력의 첫 번째 샘플과 마지막 샘플 사이에 불연속성이 있으면 관찰 한 것과 같이 울리는 것을 볼 수 있습니다. 짝수 길이의 샘플이 처음부터 끝까지 더 연속적 일 수 있으므로이 현상이 나타나지 않습니다.
—
Jason R
다른 사람이 쉽게 소화 할 수있는 형식의 데이터는 없지만 당신이 옳다고 생각합니다. 방금 작동하여 코드를 다시 컴파일 / 테스트 입력 (1 초 동안 10Hz-100Hz 처프)을 재생성하고 코드를 다시 실행하여 울리지 않았습니다. 귀하의 의견을보고 빈도를 10-100.314로 변경했으며 이제 짝수 및 홀수 변환 모두에서 울리는 것을 봅니다.
—
gct
데이터에 윈도우 함수를 적용 해 보셨습니까? 일반적으로 울림이 줄어 듭니다.
—
MarkSci