Sunday, October 6, 2019

filters - Zero STFT bins (and not FFT bins)


Filtering by taking FFT, zeroing bins, and inverse FFT is a bad idea, as discussed here.



But what about:




  • take a STFT, (i.e. multiply the input signal by moving window function, and take FFT)




  • zero some bins in the STFT matrix




  • inverse STFT (using overlap-add)





?


I've tried it, it's not bad, but I've got horizontal ripples in the spectrogram:


from perso import stft
from scipy.io import wavfile
import numpy as np
sr, x = wavfile.read('in.wav')
s = stft.stft(x, fftsize = 4096)
s[:,0:11] = 0

s[:,13:] = 0
z = stft.istft(s)
z = np.float32(z)
wavfile.write('out.wav', sr, z)

enter image description here


Important note: why do I absolutely want to do the filter in the frequency domain? Because I want to do a filter that evolves over time... With a STFT, it would be super simple to make the filter evolve for each time frame...


for k in s.shape[0]:
s[k,f(k):0] = 0 # where f(k) varies over time (k)


Is there a way to make a good-working STFT filtering in the frequency domain?




No comments:

Post a Comment

digital communications - Understanding the Matched Filter

I have a question about matched filtering. Does the matched filter maximise the SNR at the moment of decision only? As far as I understand, ...