Matlab transformée de Hilbert en C++
Tout d'abord, veuillez excuser mon ignorance dans ce domaine, je suis un programmeur par le commerce, mais ont été bloqués dans une situation un peu au-delà de mon expertise (en mathématiques et en signaux de traitement).
J'ai un script Matlab que j'ai besoin d'un port à un programme C++ (sans compiler le code matlab dans une DLL). Il utilise le hilbert()
fonction avec un argument. J'essaie de trouver un moyen de faire la même chose en C++ (c'est à dire une fonction qui prend un seul argument, et renvoie les mêmes valeurs).
J'ai lu sur les façons d'utiliser la FFT et IFFT pour la construire, mais n'arrive pas à obtenir quelque chose d'aussi simple que l'Matlab version. La chose principale est que j'en ai besoin pour travailler sur un 128*2000 de la matrice, et rien de ce que j'ai trouvé dans ma recherche m'a montré comment faire.
Je serais OK avec un complexe de valeur de retour, ou tout simplement la valeur absolue. Le plus simple c'est de s'intégrer dans le code, le mieux.
Merci.
OriginalL'auteur Jordan | 2012-08-13
Vous devez vous connecter pour publier un commentaire.
La fonction MatLab hilbert() ne fait pas de calculer la transformée de Hilbert directement, mais au lieu de cela, il calcule l'analyse du signal, qui est la chose dont on a besoin dans la plupart des cas.
Il le fait en prenant la fft la suppression de la des fréquences négatives (réglage de la moitié supérieure de la arry zéro) et l'application de la fft inverse. Il serait linéaire en C/C++ (les trois lignes de code) si vous avez de bonnes fft-la mise en œuvre.
J'ai il fonctionne parfaitement, mais le problème est que c'est LENT. Je veux dire, très lent, plus lent que MATLAB a été. Je suis l'aide de FFTW de l'interface avancée pour faire de nombreuses transformations au même plan, mais ça prend 20 secondes pour le faire 9088 transformée d'hilbert (trois étapes) de 2078 points de données chaque. MATLAB, sur le même ordinateur, prend 6 secondes. Toutes les idées sur la façon de le faire plus vite?
La FFT (FAST Fourier transform) factorise le jeu de données en ensembles plus petits (du premier numéro de la longueur) et effectue une DFT sur chacun de ceux-ci. C'est seulement rapide si l'on peut factoriser les données autant que possible, idéalement des puissances de 2 (la smalles nombre premier). Vous avez besoin à zéro pad vos données à une longueur où il peut être factorisée facilement (prendre 4096 par exemple). Votre numéro de 2078 facteurs en 2 * 1039, qui est responsable de la mauvaise performance.
Merci, c'est utile. J'ai changé mon nombre d'échantillons à 2048, et atteint 40% de baisse. Malheureusement, il est encore nettement plus lent que Matlab. Tous les autres frais de conseils?
Aussi, pour info, j'ai trouvé que c'était beaucoup plus rapide à aller avec une base de premier de 3 pour 2187 (seulement 109 collier de zéros), puis d'aller avec une base de 2 pour 4096 (2018 collier de zéros).
OriginalL'auteur André Bergner
Cette semble assez bon, aussi longtemps que vous pouvez traiter avec la licence GPL. Partie d'un beaucoup plus de ressources de calcul numérique.
Je vous remercie pour votre contribution. Mais comme pour la vitesse, ce qui sur le temps pris pour effectuer la FFT, IFFTs requis pour le domaine de fréquence de convolution? Ne serait-il pas temps total encore plus grande de cette façon?
Non, cette technique est appelée convolution rapide et très populaire dans le traitement audio, par exemple pour appliquer un long temps de réverbération de la musique en temps réel. Et, comme je l'ai écrit, il y a aussi le numérique problème avec la singularité. Dans ce lié logiciel qu'ils l'éviter, en déplaçant un peu le noyau, de sorte que la singularité est entre les deux échantillons. Mais qui ajoute une fraction de retard à la sortie, ce qui n'est probablement pas souhaitée car elle fausse le résultat lors de la construction du signal analytique. Btw, il y a aussi un autre rapide méthode d'approximation basée sur le fast-récursive (IIR) filtres – dits de Hilbert des transformateurs.
OriginalL'auteur Matt Phillips
Simple code ci-dessous. (Remarque: cela faisait partie d'un projet plus large). La valeur de L est basé sur la détermination de votre commande, N. Avec N = 2L-1. Tour N pour un nombre impair. xbar ci-dessous est basé sur le signal que vous définissez comme le signal d'entrée du système conçu. Cela a été mis en œuvre dans MATLAB.
OriginalL'auteur user3085701
Pas une vraie réponse à votre question, mais peut-être une façon de faire de vous un meilleur sommeil. Je crois que vous ne serez pas en mesure d'être beaucoup plus rapide que Matlab dans le cas particulier de ce qui est fondamentalement fft sur une matrice. C'est là que Matlab excelle!
Matlab Fft sont calculées à l'aide de FFTW, le gouvernement de facto plus rapide de l'algorithme de FFT écrit en C qui semblent également être parallélisée par Matlab. En plus de cela, citant http://www.mathworks.com/help/matlab/ref/fftw.html:
Donc, ne vous sentez pas mal si votre code est un peu plus lent...
OriginalL'auteur Johannes Rebling