J'ai récemment commencé à jouer avec la transformée de Fourier (après avoir passé quelques semaines à apprendre les mathématiques derrière elle). J'ai décidé d'essayer de pirater ensemble un filtre passe-bas sur la morsure sonore suivante:
En particulier, j'ai pris la transformée de Fourier, mis à zéro la moitié la plus élevée des fréquences, puis pris la transformée de Fourier inverse. Voilà ce que j'ai
Pourquoi y a-t-il ce bruit de crépitement?
fourier-transform
discrete-signals
sound
JeremyKun
la source
la source
Réponses:
Deux problèmes potentiels:
la source
Tout d'abord une note, les transformées de Fourier ne sont pas idéales pour les filtres passe-bas / passe-haut. Les filtres Butterworth sont un bon endroit pour commencer et suivre les filtres Chebyshev / Elliptiques si vous devenez plus ambitieux.
Il semble que vous tentiez d'implémenter un filtre idéal. Il n'y a aucun moyen de mettre en œuvre ces filtres «mur de briques» où nous coupons toutes les fréquences au-dessus / en dessous d'une valeur donnée. Tous les filtres bien développés diminueront de 1 à 0 autour de notre fréquence de coupure.
Les filtres idéaux ne sont théoriques que possibles et si vous aviez une transformation de Fourier continue, votre méthode ci-dessus fonctionnerait.
Mais nous faisons des transformées de Fourier discrètes donc il y a plus à s'inquiéter. Comme je ne suis pas sûr de la méthode de votre implémentation, je suppose que vous faites du fenêtrage, car le simple fait de retirer les fréquences est un moyen sûr de crépiter dans un DFT fenêtré.
Lors du fenêtrage dans un DFT, on pourrait penser que les amplitudes de fréquence entre les fenêtres sont relativement continues. Par exemple, si la fréquence de 400 Hz a une amplitude de 0,5 dans la fenêtre actuelle, dans la fenêtre suivante, l'amplitude sera proche de 0,5. Ce n'est malheureusement pas vrai, donc si nous supprimions simplement la fréquence de 400 Hz de notre DFT, nous pourrions entendre des bruits forts ou des fissures entre les fenêtres.
Un petit exemple: le taux de coupure est de 600 Hz. La fenêtre 1 joue un sinus de 800 Hz. La fenêtre 2 se connecte «en continu» à la fenêtre 1 et joue à 400 Hz. Ensuite, nous entendrons un pop entre la fenêtre car la fenêtre 1 sera silencieuse et la fenêtre 2 s'ouvrira immédiatement.
Une autre chose à garder à l'esprit est que nous ne pouvons représenter qu'une quantité finie de fréquences avec un DFT. Si nous avons un fichier audio avec une onde sinusoïdale d'une fréquence comprise entre deux de nos fréquences discrètes dans notre DFT, alors nous le représentons en fait avec beaucoup de nos fréquences discrètes. Donc, même si un exemple de fichier audio peut contenir une onde sinusoïdale inférieure à notre fréquence de coupure, si sa fréquence se situe entre nos fréquences DFT, nous pourrions en couper une partie et la déformer avec la méthode ci-dessus, car des fréquences plus élevées sont nécessaires pour représenter l'audio fichier.
J'espère que cela pourra aider
la source
Il est en effet possible de faire comme vous le suggérez mais non sans quelques effets secondaires. Disons que nous formons un signal de test simples ( t ) =sl o w( t ) +sh i g h( t ) où:
où nous disons que les deuxf0,f1 sont en dessous d'une fréquence de coupure passe-bas choisie fcut tel que f0<f1<fcut , et nous choisissons f2>fcut . Nous pouvons bien sûr choisir les amplitudes comme nous le souhaitons et je viens de choisir celles ci-dessus pour garder les choses simples. En ayant deux contributions de fréquence en dessous de la fréquence de coupure et une au-dessus, il est facile de suivre et de comparer les signaux.
Dans ce qui suit, je suppose que nous avonsN échantillons prélevés avec la fréquence fs>2⋅f2 . En réalité, nous choisissonsfs≫2⋅f2 pour rendre le signal observé lisse. On suppose également que nous ne considérons qu'un seul groupe d'échantillons de données. Si vous devez gérer plusieurs délais, consultez le document de Fred Harris intitulé "Sur l'utilisation de Windows pour l'analyse harmonique avec la transformation de Fourier discrète" de Proc. IEEE en 1978.
J'ai combiné un petit programme Python pour illustrer certains des concepts - le code est assez horrible mais je viens de prendre du vieux code que j'avais pour des problèmes similaires. Bien qu'il n'y ait pratiquement aucun commentaire, il devrait être assez facile à suivre en raison des petits modules. Ce sont deux fonctions dft / idft ; deux fonctions fshiftn / fshiftp pour décaler en fréquence le signal dans le domaine DFT pour le filtrage; une fonction dftlpass pour effectuer le filtrage dans le domaine DFT; une fonction zpblpass pour effectuer le filtrage en utilisant un filtre Butterworth; une fonction bbdftsig pour former le signal de test et effectuer le filtrage; et enfin une petite fonction tramepour tracer les signaux. A la fin du script, les différents paramètres sont définis et les différentes figures sont faites.
ChoisirN=5000 et fs=1000 nous donne une résolution en fréquence de fs/N=0.2 Hz. Si nous choisissonsf0,f1,f2 selon cela, nous pouvons obtenir un accord parfait en choisissant les fréquences comme indiqué ci-dessus. Si nous choisissons d'abord les fréquences qui sont sur la grille commef0=3 , f1=11 , f2=21 et nous avons fcut=15 nous obtenons la première série de résultats. Les première, moyenne et dernière parties des signaux concernés sont présentées ci-dessous:
Comme le montre la figure, nous avons l'entrée combinées comme signal magenta; le signal vert comme nous ne pouvons le voir que sur les marquages «x» estslow (le signal d'entrée brut lorsque nous incluons simplement le signal d'entrée en dessous de la fréquence de coupure); le signal rouge est celui que nous obtenons lors de l'utilisation du filtrage DFT; et le signal bleu est celui que nous obtenons du filtre Butterworth. Comme vu ci-dessus, nous obtenons un accord parfait entreslow et le signal filtré DFT - mais le filtre Butterworth a un certain impact sur le signal dans la bande (en particulier le composant à f1 . Comme c'est assez typique pour ce type de traitement, nous avons quelques différences au début et à la fin de la séquence en raison des effets de bord et d'un accord assez bon entre les deux types de filtrage dans la section centrale.
Si nous changeons la fréquencef1 à f1=11.5 qui n'est pas sur la grille de fréquence (et en plus elle est assez proche de la fréquence de coupure), nous voyons des résultats différents comme indiqué ci-dessous.
Nous voyons maintenant des différences substantielles entre les signaux vert, bleu et rouge qui, dans la situation idéale, devraient être identiques. Au milieu du signal, ils sont tous assez bien d'accord - la DFT et la référenceslow d'accord mieux cependant.
Ainsi, en conclusion, il est possible d'utiliser le filtrage direct en forçant les coefficients de Fourier à zéro, ce qui est également parfois fait en détection compressive pour réduire le support d'un signal pour forcer la rareté sur un signal. Cependant, cela a des conséquences comme une augmentation des erreurs, en particulier aux bords du signal. En outre, ce qui précède est un meilleur cas où le signal entier est traité comme une séquence. Si le signal doit être divisé en intervalles de temps, cela devient compliqué car nous devons alors envisager un fenêtrage ou une autre technique pour assurer la continuité du signal entre les images. Donc, mon conseil est similaire à certains des autres articles en recommandant d'utiliser normalement un filtre Butterworth / Elliptic / .. ou autre.
la source
La remise à zéro des cases dans une FFT peut en fait augmenter l'amplitude d'autres fréquences proches mais non centrées sur la case zero-ed ou ses cases adjacentes. Cette augmentation peut provoquer un écrêtage.
De plus, si vous effectuez la FFT en utilisant des blocs non-zéros (et non superposés) (par opposition à la chanson entière dans une grande FFT), toutes les modifications de données FFT se dérouleront de l'arrière vers l'avant de la séquence de domaine temporel dans chaque bloc, ajoutant ainsi d'autres discontinuités étranges aux mauvais endroits.
la source
Voici un filtre passe-bande FFT à mise à zéro rapide et sale, avec le code FFT également.
pour chaque échantillon de l'audio d'entrée, appelez passe-bande principal avec l'échantillon d'entrée et la plage de fréquences que vous souhaitez conserver en lowcut et highcut. Si le raccourci est supérieur au raccourci, le résultat sera un filtre de rejet de bande. Il y a une convolution circulaire, mais il n'y aura pas d'émissions hors bande, ce qui est bon pour les modems.
la source