I taped myself hitting forehands and realized that I'm hitting the ball way past its highest point. Take a look at the these two stills. The first one shows the ball at the top of its trajectory, just above shoulder height. The second is the hitting point, just above the waist, and probably 3-4 feet behind the first point.



You can see how much height and horizontal distance I've given up.
Another observation: in forehand preparation, Federer turns the hips and loads the legs, then explodes up and slightly forward, with the hitting arm moving down way below the ball before hitting. What I'm doing looks different, and I can't quite figure it out. For one thing, I load the legs, but then hesitate, and do this mini prep again just before hitting. The hitting arm also hesitates for a second, and goes nearly horizontally instead of down. Overall, it feels like I'm loading the right leg, then sort of swaying over to the left leg as I'm hitting. Federer just goes nicely straight up.
Today in practice I tried to do a couple things. First, I tried to meet the ball at the top of its trajectory, which felt much earlier than usual. I need to work on timing and it felt a bit awkward, but I was able to hit with great power and easily clear the net, because in many cases I was hitting almost at shoulder height and didn't have to hit up.
Second, I tried to make sure I explode up and forward/to the right, without shifting my weight from right to left foot.
Finally, I tried to see that my hitting arm was way below the ball before coming up for a hit. To do that, I had to start the swing earlier so that I have time to describe a smooth trajectory with my arm. The shots had much more top spin and landed with a lot of margin.
What frustrated me immensely in my last match was my inability to hit with pace. The oncoming balls had medium pace and lots of topspin, and I ended up either slicing or pushing them back. I think hitting aggressively at the top of the ball's trajectory would solve the problem.