Trước tiên, một minh chứng rằng các hình vuông của cả
[…,0,0,1,−1,0,0,…] and[…,0,0,1,−1,0,0,…]
công bằng
[…,0,0,1,−1,0,0,…] and
nhưng bình phương của các phép nội suy chân thành của chúng khác nhau (Hình 1):
Hình 1. Hình vuông của các phép nội suy chân thành của (màu xanh) và (màu đỏ).[1,1][1,−1]
Điều này chứng tỏ rằng nói chung không thể phục hồi bình phương của tín hiệu giới hạn băng tần từ các mẫu thống nhất của nó được lấy ở tần số lấy mẫu quan trọng của tín hiệu giới hạn băng tần.
Hãy thử nghiệm các phương pháp nội suy khác nhau trong Octave. Tiêu chuẩn vàng của phép nội suy giới hạn băng tần là DFT không zero pad pad DFT:
>> format free
>> x = [1 2 3];
>> y = [1 2 3 0 0 0];
>> abs(fft(x))
ans =
6 1.73205 1.73205
>> abs(fft(y))
ans =
6 4.3589 1.73205 2 1.73205 4.3589
Tập hợp số cuối cùng là các giá trị cường độ được tính toán từ các thùng miền tần số được nội suy hoàn hảo. Thay vào đó, hãy thử nội suy độ lớn :
>> fft(fftshift(horzcat([0 0], fftshift(ifft(abs(fft(x)))), [0])))
ans =
6 4.57735 1.73205 0.309401 1.73205 4.57735
Có vẻ khá một chút. Bây giờ chúng ta hãy thử nội suy độ lớn bình phương :
>> fft(fftshift(horzcat([0 0], fftshift(ifft(abs(fft(x)).^2)), [0])))
ans =
36 25 3 -8 3 25
>> sqrt(ans)
ans =
(6,0) (5,0) (1.73205,0) (0,2.82843) (1.73205,0) (5,0)
Nó không chỉ tắt mà còn sqrt()
trả về một số phức cho giá trị nội suy âm. Vì vậy, cách duy nhất hợp lệ để nội suy các giá trị bin?
Chúng ta hãy cho cơ hội này thêm một lần nữa, bằng cách cố gắng nội suy dữ liệu miền tần số được nhân đôi theo hệ số 2. Do biến đổi độ dài chẵn, điều này đòi hỏi phải sao chép "mẫu Nyquist", vì vậy xin lỗi nếu mã khó đọc.
>> z = [1 2 3 0 0 0 0 0 0 0 0 0];
>> abs(fft(z))
ans =
6 5.55485 4.3589 2.82843 1.73205 1.77302 2 1.77302 1.73205 2.82843 4.3589 5.55485
Trên đây là những gì chúng ta muốn. Chúng ta hãy thử nội suy cường độ tăng gấp đôi :
>> fftshift(horzcat([0 0 0], fftshift(ifft(abs(fft(y)))), [0 0 0]))
ans =
3.36365 1.10447 0.318175 0 0 0 0 0 0 -0.208949 0.318175 1.10447
>> ans(4) = ans(length(ans)-2)
ans =
3.36365 1.10447 0.318175 -0.208949 0 0 0 0 0 -0.208949 0.318175 1.10447
>> fft(ans)
ans =
5.79105 5.59483 4.56785 2.7273 1.5231 1.76882
2.20895 1.76882 1.5231 2.7273 4.56785 5.59483
Điều đó vẫn còn. Chúng ta hãy thử nội suy độ lớn gấp đôi bình phương :
>> fftshift(horzcat([0 0 0], fftshift(ifft(abs(fft(y)).^2)), [0 0 0]))
ans =
14 8 3 0 0 0 0 0 0 1.18424e-15 3 8
>> ans(4) = ans(length(ans)-2)
ans =
14 8 3 1.18424e-15 0 0 0 0 0 1.18424e-15 3 8
>> sqrt(fft(ans))
ans =
6 5.55485 4.3589 2.82843 1.73205 1.77302 2 1.77302 1.73205 2.82843 4.3589 5.55485
Bây giờ nó hoạt động hoàn hảo! Thông điệp mang về nhà là lấy mẫu (pad thời gian bằng 0) ít nhất là theo hệ số hai trước khi cố gắng nội suy trong miền tần số và nội suy cường độ bình phương thay vì cường độ. Nó hoạt động vì lấy độ lớn bình phương giống như nhân mỗi giá trị bin với liên hợp phức tạp của nó. Phép chia phức bảo tồn băng thông của hàm được giới hạn bởi dữ liệu, do đó phép nhân tăng gấp đôi "băng thông miền thời gian" vì nó tương đương với tích chập miền thời gian. Lưu ý rằng khi chọn phương pháp nội suy, cường độ bình phương tăng gấp đôi vẫn được lấy mẫu nghiêm trọng, do đó, quá mức quá mức sẽ làm cho phép nội suy chính xác dễ dàng hơn nhiều.
Tôi đã trả lời câu hỏi của riêng tôi, nhưng sẽ chấp nhận cái nhìn sâu sắc hơn như một câu trả lời!
PS Chỉ cần tìm ra cũng có interpft
, nội suy với cú pháp ít hơn.
Sử dụng thông tin bổ sung
Nội suy trở nên dễ dàng hơn hoặc thậm chí chính xác với thông tin bổ sung về dữ liệu, ví dụ: đó là một hình vuông được thay đổi theo bình phương được lấy mẫu theo thời gian. Trong trường hợp đó, với hai mẫu ngay trước và ngay sau mẫu lớn nhất, thời gian của đỉnh có thể được tính bằng:αγ−1<d<1
d={01−1−p2√p,p=γ−αα+γif α=γ,otherwise,
với có nghĩa là độ chân được chuyển sang chính xác thời gian của mẫu lớn nhất. Phép nội suy tương tự có thể được thực hiện ở một nửa tốc độ mẫu, đó là tần số lấy mẫu quan trọng của hàm cơ bản, độ lớn bằng với độ lệch dịch chuyển thời gian, với hai mẫu có giá trị lớn nhất kế tiếp và của hình vuông của giá trị tuyệt đối của hàm bên dưới:d=0αβ
0≤d≤1d=⎧⎩⎨⎪⎪⎪⎪011+p−1−p2√2p,p=β−αα+βif β=0,if α=0,otherwise,
Các công thức không bị ảnh hưởng bởi tỷ lệ biên độ của dữ liệu. Để ước tính tần suất, bạn hiếm khi có một sự thay đổi hoàn toàn theo thời gian thực, nhưng nếu bạn thực hiện, có các công thức nội suy chính xác cho nó .