Question

Je me demande si quelque chose comme cela est possible (et relativement facile à faire), et si oui, comment je pourrais le faire?

Je souhaite effectuer un filtrage de bande sur un fichier wave que je reproduis. Quelque chose de similaire au " Equalizer " que vous voyez dans la plupart des applications de type Winamp.
Mon idée n'est toutefois pas d'égaliser le son, mais d'utiliser des valeurs négatives très élevées en dB, afin de tuer presque la bande que je filtre.

La première question est: Est-ce que DirectSound me donne quelque chose qui me permet de le faire?
Si non: comment allez-vous mettre en œuvre cela?
Je sais (même si je ne le comprends pas tout à fait complètement) qu'il est possible de convertir la forme d'onde échantillonnée en distribution de fréquences à l'aide d'une transformation de Fourier rapide. Maintenant, je ne peux évidemment pas revenir de cette distribution à la forme d'onde d'origine après avoir modifié les valeurs d'amplitude de certaines fréquences :-)

Comment pourrais-je faire quelque chose comme ça?

Aussi, quelle précision puis-je créer avec ces filtres? (Si je voulais filtrer tout ce qui va de 2250Hz à 2275Hz, quelle serait l'erreur d'un filtre? Quelle serait la précision maximale que je pourrais obtenir?)

Merci!

Était-ce utile?

La solution

Je ne sais pas si DirectSound offre cette fonctionnalité, je suppose que ce n’est pas le cas, car le DSP est assez compliqué et varie souvent beaucoup d’une situation à l’autre. Ce que vous voulez faire s'appelle généralement "filtrage". en DSP (traitement numérique du signal). Cela implique souvent l’utilisation d’un filtre FIR (réponse impulsionnelle finie). Il existe de nombreuses bibliothèques pour faire exactement ce que vous voulez. L'un des aspects les plus délicats de la conception des filtres est qu'il existe toujours des compromis entre vitesse, précision et erreur. Dans votre exemple, vous pourrez supprimer le signal entre les fréquences, mais cela affectera également les fréquences environnantes. La quantité que cela va affecter est liée au temps de traitement et à la conception du filtre.

Commencez peut-être ici (mathématiques lourdes): Filtre FIR

Ensuite, recherchez Google pour vos propres informations relatives aux FIR spécifiques à Windows / DirectSound

Autres conseils

Autant que je sache, DirectSound ne fait pas le filtrage de bande comme vous le décrivez ici.

L’idée générale derrière le filtrage passe-bande est d’utiliser des lignes à retard, qui prennent le signal en sortie et le renvoient dans le flux d’entrée, avec un temps de retard et un facteur de décroissance (ou d’atténuation) spécifiés. Une conception soignée du filtre vous permettra d’amplifier ou d’atténuer des gammes de fréquences spécifiques dans votre source audio. Notez que cette technique n'utilise pas la FFT, sauf en tant qu'outil de diagnostic lors du test des effets de filtre. Les techniques FFT permettent de limiter ou d’amplifier les fréquences de manière plus précise, mais les lignes à retard sont généralement plus rapides (et beaucoup plus faciles à coder).

Pour traiter un fichier WAV (par opposition à la synthèse / filtrage en temps réel), exécuter une ligne à retard sur votre mémoire tampon est aussi simple que:

for (int i = 0; i < samples.Length - delay; i++)
{
    samples[i + delay] += samples[i] * decay;
}

C’est un peu plus compliqué que cela dans la pratique (vous devez par exemple gérer les débordements éventuels, et certains types de lignes à retard doivent être inversés, ce qui est toujours pénible pour le codage de style C), bien sûr.

En ce qui concerne la précision du filtre, cela dépend de la qualité de sa conception (très difficile). Lorsque vous concevez un filtre utilisant des lignes à retard, vous faites essentiellement ce que les ingénieurs électriciens ont fait (et font encore) au cours des décennies qui ont précédé les microprocesseurs économiques.

DirectSound n’offre aucune installation de traitement de signal. Vous pouvez utiliser différentes techniques pour faire ce que vous voulez. Il est possible d'utiliser la FFT pour faire ce que vous voulez, mais ce n'est probablement pas la meilleure méthode ni la plus simple. Vous devriez lire sur DSP audio, en particulier le filtrage numérique (IIR, FIR). Un bon livre de DSP est disponible gratuitement en ligne et s'intitule Le Guide du scientifique et de l'ingénieur pour le traitement du signal numérique qui vaut vraiment la peine un regard. Il existe également de nombreux autres bons livres DSP disponibles sur Amazon, etc.

.

Je ne connais aucune bibliothèque qui s'occupe directement de ce genre de choses.

Vous pouvez obtenir ce que vous voulez avec les transformations de Fourier. Des implémentations telles que la FFTW effectuent le calcul pour vous, mais à mon avis, vous travaillez avec méchanceté et utilisez une quantité de mémoire prodigieuse, en particulier si vous souhaitez traiter des morceaux audio plus longs en un seul coup.

L'idée de base pour l'application de l'eq avec FFT est la suivante:

  1. Obtenez votre audio. L’audio est un très long tableau de valeurs (échantillons) qui correspond au déplacement du cône du haut-parleur / dans le temps.
  2. Effectuez la transformation de Fourier de l'audio (la librairie le fera, mais vous devrez shunter les échantillons audio au format correct. Cela convertit les échantillons basés sur le temps en une représentation basée sur la fréquence - essentiellement, le signal est converti en affiche la distribution des fréquences dans le signal.
  3. Divisez la distribution de fréquence vers le haut - divisez la distribution en régions, chaque région correspond à une plage de fréquences.
  4. Vous pouvez ensuite effectuer des réglages sur les bandes de fréquence. Pour votre exemple, vous pouvez mettre à zéro une région pour en supprimer toute trace.
  5. Prenez la transformée de Fourier inverse de la distribution de fréquence mise à jour. Cela ramènera la représentation dans le domaine temporel, en reconstruisant une (approximation) du signal d'origine, mais avec les ajustements que vous avez effectués.

Faire quelque chose comme cela vous permettra de manipuler avec précision les fréquences présentes dans votre fichier audio en vous donnant le type de contrôle que vous semblez vouloir. Soyez averti cependant que sa mise en œuvre n'est pas simple.

Je recommande de lire sur le sujet. La détection de battement est assez étroitement liée à beaucoup de ce problème (utilise beaucoup les techniques de base) - essayez les premières sections ici pour commencer.

J'espère que ça aide un peu.

DirectSound peut ne pas supporter cela directement, mais DirectShow le devrait. Pourriez-vous utiliser cette API à la place?

Je partage l’idée du filtre FIR. Pour obtenir une encoche étroite, vous aurez besoin d’un long noyau filtrant.

En gros, vous utilisez la convolution du flux d’entrée par rapport à un ensemble de valeurs (le noyau). Chaque échantillon de sortie est la somme des N échantillons précédents multipliés par son entrée correspondante dans le noyau du filtre.

Vous devez donc conserver un tableau de noyau et une mémoire tampon FIFO ou circulaire du même nombre d'échantillons.

Il s’agit de calculatrices à noyau de filtre FIR sur le Web, il suffit de cliquer sur Google pour "Calculateur de filtre FIR".

Vous devriez pouvoir faire une FFT, déconner dans le domaine fréquentiel (échelonnage des fréquences), puis effectuer un IFFT pour récupérer le signal dans le domaine temporel. Autrement, concevoir des filtres avec ScopeFIR ou MATLAB est assez facile. ScopeFIR peut facilement concevoir un filtre coupe-bande et vous donner les coefficients afin que vous puissiez faire une convolution sur le signal. Voici un tutoriel du site Web ScopeFIR: http://www.iowegian.com/fir/ tuteur / firintro.htm

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top