我需要在 Python 中實作一個低通濾波器,但我可以使用的唯一模塊是 numpy(不是 scipy)。我嘗試np.fft.fft()在信號上使用,然后將所有高于截止頻率的頻率設定為 0,然后使用np.fft.ifft(). 但是這不起作用,我根本不知道如何應用過濾器。
編輯:
更改np.abs()為np.real()結果后幾乎是正確的。但是在頻譜圖中,幅度比原始參考和過濾參考的幅度小(差異為 6dB)。所以看起來它并不完全正確。任何想法可以做些什么來解決這個問題?
我的 Lowpass 函式應采用以下引數:
signal: audio signal to be filtered
cutoff_freq: cout off frequency in Hz above which to cut off frequencies
sampling_rate: sampling rate in samples/second
應回傳過濾后的信號。
我目前的功能
def low_pass_filter(adata: np.ndarray, bandlimit: int = 1000, sampling_rate: int = 44100) -> np.ndarray:
# translate bandlimit from Hz to dataindex according to sampling rate and data size
bandlimit_index = int(bandlimit * adata.size / sampling_rate)
fsig = np.fft.fft(adata)
for i in range(bandlimit_index 1, len(fsig)):
fsig[i] = 0
adata_filtered = np.fft.ifft(fsig)
return np.real(adata_filtered)
uj5u.com熱心網友回復:
我看到@Cris Luengo 的評論已經使您的解決方案朝著正確的方向發展。您現在缺少的最后一件事是您從中獲得的頻譜np.fft.fft由前半部分的正頻率分量和后半部分的“鏡像”負頻率分量組成。
如果您現在將除您之外的所有分量設定bandlimit_index為零,那么您將消除這些負頻率分量,這些分量也是該np.fft.ifft函式期望用于恢復您的濾波信號(查看ifft 檔案)。它指出:
“輸入的排序方式應與 fft 回傳的方式相同,即,”
- a[0] 應該包含零頻率項,
- a[1:n//2] 應該包含正頻率項,
- a[n//2 1:] 應該包含負頻率項,從最負頻率開始按升序排列。
這本質上就是你必須保持的對稱性。因此,為了保留這些組件,只需將組件設定bandlimit_index 1 -> (len(fsig) - bandlimit_index)為零。
def low_pass_filter(adata: np.ndarray, bandlimit: int = 1000, sampling_rate: int = 44100) -> np.ndarray:
# translate bandlimit from Hz to dataindex according to sampling rate and data size
bandlimit_index = int(bandlimit * adata.size / sampling_rate)
fsig = np.fft.fft(adata)
for i in range(bandlimit_index 1, len(fsig) - bandlimit_index ):
fsig[i] = 0
adata_filtered = np.fft.ifft(fsig)
return np.real(adata_filtered)
或者如果你想稍微更“pythonic”,你也可以像這樣將組件設定為零:
fsig[bandlimit_index 1 : -bandlimit_index] = 0
uj5u.com熱心網友回復:
首先,您應該查看低通濾波器設計的數學建模步驟。因此,該網站可能有助于從頭開始構建低通濾波器。
最好的,
https://www.dsprelated.com/freebooks/filters/Simplest_Lowpass_Filter_I.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/420088.html
標籤:
下一篇:科學記數法未顯示在資料框中
