Usando GPU no Silverlight 5 para uma transformação rápida de Fourier

7

Eu tenho uma biblioteca de áudio para o Silverlight que precisa de alguma aceleração em máquinas mais lentas. Especificamente, esta biblioteca faz uso extensivo e repetido da transformação FFT como parte de seus algoritmos de cancelamento de eco acústico e redução de ruído, e estou pensando se faria algum sentido usar a GPU para isso (como descrito, por exemplo, aqui: http://www.inf.fu-berlin.de/lehre/SS10/SP-Par/download/fft1.pdf ).

Eu sei que o Silverlight 5 fornece uma porta bastante simples da estrutura XNA da Microsoft, mas, infelizmente, sou um novato em codificação 3D em geral e XNA em particular. Parece-me que deveria ser teoricamente possível usar alguma combinação de vértices e / ou pixel shaders para fazer essa mágica, mas antes de ir muito longe nesse caminho, eu queria obter algumas opiniões de especialistas em algumas perguntas:

(1) A implementação XNA do SL5 lança a saída de seu pipeline em um único "DrawingSurface". Eu estava pensando que era aqui que eu poderia ler os resultados dos cálculos (como você pode usar um WriteableBitmap para ler os resultados dos cálculos de pixel shader no SL4). Mas não consigo descobrir como faria isso: não há método "GetPixels ()" ou algo assim. Em XNA regulares 4.0, o VertexBuffer tem um GetData () método, como fazem os Texture2D e Texture3D classes, mas esses métodos estão em falta na versão SL5 . Alguém sabe alguma maneira de realmente ler os resultados das saídas do shader? Ou a GPU é um dispositivo somente gravação no SL5?

(2) Parece que o verdadeiro problema dos cálculos de GPU é ler os resultados rapidamente . Supondo que eu possa resolver o problema nº 1, alguém sabe se uma FFT seria favorável a esse tipo de solução?

(3) O Silverlight 5 é limitado ao HLSL Nível 2, que possui várias limitações sérias, desde que instruções, registros, funções disponíveis e assim por diante. É razoável esperar ser capaz de portar uma FFT ou parte dela para isso?

Desde já, obrigado.

Ken Smith
fonte
11
você pode descrever as operações matemáticas que precisa fazer? é necessário ser um efeito em tempo real? pode ser atrasado? você precisa usar um destino de renderização para desenhar seus cálculos e GetData para recuperá-los. Tem certeza de que a textura não possui dados de get?
Blau
Estou aprimorando o áudio em tempo real, usando a pilha WebRTC do Google (que eu portado para C #). Isso inclui cancelamento de eco acústico, redução de ruído e controle automático de ganho, entre outros. Há muita matemática em ponto flutuante envolvida, a maior parte relacionada à conversão dos sinais do domínio do tempo para o domínio da frequência, o que é feito usando uma Transformação rápida de Fourier. Pela natureza da besta, ela precisa ser em tempo real. E de acordo com o MSDN ( msdn.microsoft.com/en-us/library/… ), nenhum método Texture.GetData ().
8119 Ken Smith
Uupps ... com silverlight, a Texture não tem GetData ... estou procurando uma solução alternativa, mas sem sucesso ... recomendo que você publique no post de Shawn sobre xna e silverlight ... blogs.msdn.com/b/ shawnhar / Arquivo / 2011/10/05 / ... ele pode dar alguma solução
Blau
11
Isso não responder à sua pergunta, mas D3D11 tem ID3DX11FFT interface, o que simplifica consideravelmente a quantidade de trabalho que você tem que fazer
bobobobo
@obobobo - Bem, você está certo, isso não ajuda. Mas isso me deixa com ciúmes. Se eu pudesse acessar isso no Silverlight, isso aceleraria meu código consideravelmente, suspeito. Oh bem ...
Ken Smith

Respostas:

3

De acordo com Shawn Hargreaves (do MS), isso não é suportado no Silverlight 5. Seu palpite não oficial sobre o porquê é que (a) seria difícil fazê-lo funcionar consistentemente em todos os drivers de GPU e (b) para todos, exceto uma minúscula classe de problemas no estilo de demonstração, não faria sentido.

Ah bem.

Ken Smith
fonte