나는 부분 지연 필터를 설계하고 있으며, 5 h (n) 차수 계수는 시간 영역에서 6 탭을 가지고 있습니다. 나는 h (n) x (n)은 matlab를 사용하여 5000 샘플 신호와 convolute 테스트 결과를 확인 보인다. FFT 및 IFFT 메서드를 사용하려고하면 출력이 완전히 잘못되었습니다. 사실 내 FFT는 주파수 도메인에서 8192 데이터로 계산됩니다.이 데이터는 5000 신호 샘플에 대해 2의 가장 가까운 제곱입니다. IFFT 부분에서 8192 주파수 도메인 데이터를 다시 시간 도메인의 5000 길이 데이터로 변환합니다. 그래서 문제는 왜이 것이 컨볼 루션에서 작동하지만 FFT 곱셈에서는 작동하지 않습니다. 주파수 도메인에서 6 탭 (h) (n)을 8192 탭으로 변환하면이 문제가 발생합니까?FFT 길이가 필터링 정확도에 영향을 줍니까?
사실 나는 x (n)의 작은 덩어리로 FFT와 곱셈을 수행하고 별도로 5 번 수행하는 overlap-save 방법을 사용해 보았습니다. 결과는 이전보다 약간 좋아 보이지만 적어도 파형 패턴을 볼 수는 있지만 여전히 약간 왜곡되어 있습니다. 그래서, 어떤 생각이 잘못되었는지, 그리고 해결책은 무엇입니까. 고맙습니다.
시간 도메인 대신 주파수 도메인에서 순환 컨볼 루션을 구현하는 이유는 Lagrange 필터를 주파수 도메인의 다른 로우 패스 필터와 병합하여 구현이 더욱 효율적으로 이루어 지도록하려고하기 때문입니다. 물론 주파수 영역에서의 필터링 구현은 시간 영역에서의 회선보다 훨씬 빠르다고 믿습니다. LP 필터는 시간 영역에서 120 개의 탭을 갖는다. 메모리 제약으로 인해 패딩을 포함하는 원시 데이터 길이가 1024로 제한되므로 fft 빈도 제한됩니다.
내 Lagrange 계수에는 탭이 6 개 밖에 없으므로 1024 탭과 크게 다릅니다. 주파수 도메인에서 1024 개의 bin으로 6 회 탭 중 fft가 오류를 일으킬 것입니다. 다음은 Lagrange 필터에 대한 내 matlab 코드입니다. 이것은 테스트 코드 일 뿐이며 구현 코드가 아닙니다. 좀 지저분 해, 미안해. 이 문제에 대한 조언을 더 많이 주시면 감사하겠습니다. 고맙습니다.
t=1:5000;
fs=2.5*(10^12);
A=70000;
x=A*sin(2*pi*10.*t.*(10^6).*t./fs);
delay=0.4;
N=5;
n = 0:N;
h = ones(1,N+1);
for k = 0:N
index = find(n ~= k);
h(index) = h(index) * (delay-k)./ (n(index)-k);
end
pad=zeros(1,length(h)-1);
out=[];
H=fft(hh,1024);
H=fft([h zeros(1,1024-length(h))]);
for i=0:1:ceil(length(x)/(1024-length(h)+1))-1
if (i ~= ceil(length(x)/(1024-length(h)+1))-1)
a=x(1,i*(1024-length(h)+1)+1:(i+1)*(1024-length(h)+1));
else
temp=x(1,i*(1024-length(h)+1)+1:length(x));
a=[temp zeros(1,1024-length(h)+1-length(temp))];
end
xx=[pad a];
X=fft(xx,1024);
Y=H.*X;
y=abs(ifft(Y,1024));
out=[out y(1,length(h):length(y))];
pad=y(1,length(a)+1:length(y));
end
설명을 통해 처음 시도한 기법이 효과가있었습니다. 코드를 게시하고 결과가 잘못되었다고 생각하는 이유는 무엇입니까? 또한, 6- 탭 FIR 필터의 경우, 오버랩 - 세이브 프로세싱에서 이점이별로 없다. 그러나 예를보고 싶다면 두 번째 코드 블록이 여기에 흥미가 있습니다. http://stackoverflow.com/questions/2929401/dsp-filtering-in-the-frequency-domain-via-fft/2949227#2949227 – mtrw
'hh'와'x'가 정의되지 않았기 때문에 코드가 실행되지 않습니다. – mtrw